Como gravar remotamente em um arquivo usando SSH

41

Posso copiar um arquivo para uma máquina Linux remota sem problemas com

scp file user@host: /pathtowrite_file

No entanto, estou tendo dificuldade em gravar em um arquivo de uma máquina Linux para outra. Aqui está o que eu tentei:

echo 'Some Text' > /remotefile.txt | ssh user@remotehost

O aviso que recebo é

stdin: não é um tty

De qualquer forma, o arquivo na máquina remota não reflete o texto enviado 'Algum texto'.

Suficiente
fonte

Respostas:

70

Você pode usar o comando "cat" para criar o arquivo remoto.

echo 'Some Text' | ssh user@remotehost -T "cat > /remotefile.txt"

Os -Tdesativa pseudo-terminal de alocação e pára-lo de obter a mensagem,

O pseudo-terminal não será alocado porque stdin não é um terminal.

Aragorn
fonte
mas quero escrever no arquivo existente na máquina remota.
Suffa
2
os "cat> /remotefile.txt" corre na máquina remota e se você deseja anexar um arquivo existente substituir ">" por ">>"
Aragorn
@ Suffa: Você está tentando anexar a um arquivo existente? Ou você deseja sobrescrever o arquivo, mas falha se ele ainda não existe? Ou o que?
David Schwartz
@ David Schwartz - também. Gostaria de sobrescrever e falhar se não sair ... mas, gostaria de acrescentar apenas neste momento.
Suffa
O `echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` também funcionou para mim.
Simply Seth
10

Um pouco mais curto que a outra resposta:

ssh user@remotehost "echo Some Text > /remotefile.txt"
g33kz0r
fonte
3
Verdade; isso funcionará - se escrever uma única linha de texto no arquivo remoto é realmente tudo o que o OP deseja fazer. O comando na pergunta parece um teste de prova de conceito. A pergunta diz: "gravando em um arquivo de uma máquina Linux para outra". Se o usuário deseja executar um comando arbitrário (ou sequência de comandos) - e não apenas um echo- localmente, sua resposta não ajuda, e a resposta aceita é a maneira de fazê-lo.
Scott
@ Scott Vários comandos também são possíveis usando esta abordagem. Como a maioria das coisas Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r 18/11/2015
Cara legal, obrigado pelo voto negativo. Eu acho que é mais fácil do que realmente abordar o meu ponto? PS seu comentário acima não faz sentido.
g33kz0r
1
OK, você quer mais críticas? (1) Por que você está dizendo ssh localhost? Isso é apenas enlamear a água, não tornando-a mais clara. (2) Ao não mostrar o redirecionamento no seu exemplo modificado, você levanta a questão de saber como agrupar comandos e enviar toda a saída para um arquivo. ... (continua)
Scott
1
(Continua)… (3) Você perdeu o meu argumento, concentrando-se na frase “uma única linha de texto”. Meu argumento foi que o OP pode querer fazer algo mais sofisticado do que escrever texto conhecido no arquivo remoto - ele pode executar um comando local e enviar a saída para o arquivo remoto, como em . Se você pode adaptar sua resposta para resolver esse caso geral, faça-o. command (localhost) > file (remotehost)
Scott
6

Também é possível usar o dd para anexar a um arquivo. Talvez um pouco obscuro, mas útil se o redirecionamento de saída no host remoto não for possível.

cat ~/.ssh/id_rsa.pub | ssh user@remote.host 'dd of=.ssh/authorized_keys oflag=append conv=notrunc'

Este exemplo anexa sua chave pública ao arquivo allowed_keys no host remoto.

(Fonte: http://www.rsync.net/resources/howto/ssh_keys.html )

sdl
fonte
3

Isso pega o conteúdo da sua área de transferência em um Mac e anexa-o ao final de um arquivo remotamente:

pbpaste | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'

Isso permite gravar (anexar) no final de um arquivo em um host remoto:

echo "Append string to file" | ssh root@my.machine.remote 'cat >> ~/.ssh/authorized_keys'
David
fonte
1

Se precisar ser usado várias vezes, pode ser mais fácil usar esse código. Com a ferramenta "sshpass", o ssh não solicitará uma senha para cada chamada do script. (a menos que você precise mantê-lo em segredo, é melhor não usá-lo)

Para obter mais informações sobre o sshpass: https://stackoverflow.com/questions/12202587/automatically-enter-ssh-password-with-script

#!/bin/bash

SCRIPT="echo 'nameserver 8.8.8.8' > /etc/resolv.conf"        

if [ "$#" -ne 1 ]; then
        echo "Wrong number of arguments. usage: prog dest_machine"
else
        sshpass -p "root" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
fi
sergeyrar
fonte
Mais intuitivo do que o que? Isso é essencialmente o mesmo que a resposta de g33kz0r (de quase dois anos atrás), além de alguns sinos e apitos que não são particularmente claros. Pelo menos explique as coisas que você adicionou.
Scott
Se o seu script for chamado com muitos argumentos, ele emitirá uma mensagem de erro informando que há muito poucos argumentos.
G-Man diz 'Reinstate Monica'
Sim, é quase o mesmo que você está certo. A única coisa que acrescenta é que é um pouco mais fácil de usar (se necessário várias vezes). E sim, a mensagem de erro não é boa, vou corrigi-la.
Sergeyrar 01/10/19
1

Você pode simplesmente usar viou nanoou picoeditor:

# Just replace "vi" with "nano" or "pico" if you want to use them.
vi remotefile.txt

No entanto, você precisará gravá Some Text-lo no editor por conta própria, para que esse processo não seja realmente compatível com lotes.

Riptide9.7
fonte
-1

Crie um script como abaixo:

# !/bin/bash

read -p "Enter target server IP : " server
echo "Enter root password for $server : " ; read -s password

yum install sshpass -y

sshpass -p "$password" ssh -o strictHostKeyChecking=no root@$server echo "your text goes here" >> /remotefile.txt
Abhilash Mishra
fonte
Vejo o voto negativo - provavelmente de alguém que não usará um novo comando yumsem uma boa razão. Esta resposta mostra como, mas não o porquê. (Cancelar a downvote para o momento - Eu espero que você irá editar este para fornecer mais contexto)
SDsolar