Come scrivere in remoto su un file usando SSH


41

Posso copiare un file su una macchina Linux remota senza problemi

scp file user@host: /pathtowrite_file

Tuttavia, ho difficoltà a scrivere su un file da una macchina Linux a un'altra. Ecco cosa ho tentato:

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

L'avviso che ricevo è

stdin: non è un tty

In ogni caso, il file sul computer remoto non riflette il testo inviato "Some Text".

Risposte:


70

È possibile utilizzare il comando "cat" per creare il file remoto.

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

I -Tdisabili allocazione pseudo-terminale e vi impedisce di ottenere il messaggio,

Lo pseudo-terminale non verrà allocato perché stdin non è un terminale.


ma, voglio scrivere sul file esistente sul computer remoto.
suffa

2
il "gatto> /remotefile.txt" viene eseguito sul computer remoto e se si desidera aggiungere un file esistente, sostituire ">" con ">>"
Aragorn

@suffa: stai provando ad aggiungere a un file esistente? Oppure vuoi sovrascrivere il file ma fallisci se non esiste già? O cosa?
David Schwartz,

@ David Schwartz - neanche. Vorrei sovrascrivere, e fallire se non esce ... ma, accetterei semplicemente di aggiungere a questo punto.
suffa

`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` ha funzionato anche per me.
Semplicemente Seth,

10

Un po 'più breve dell'altra risposta:

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

3
Vero; questo funzionerà - se scrivere una singola riga di testo nel file remoto è davvero tutto ciò che l'OP vuole fare. Il comando nella domanda sembra un test di prova. La domanda dice "scrivere su un file da una macchina Linux a un'altra". Se l'utente desidera eseguire un comando arbitrario (o sequenza di comandi) - e non solo un echo- localmente, la tua risposta non aiuta e la risposta accettata è il modo di farlo.
Scott,

@Scott Sono anche possibili più comandi usando questo approccio. Come la maggior parte delle cose Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r

Bello amico, grazie per il downvote. Immagino sia più facile che affrontare il mio punto? PS il tuo commento sopra non ha senso.
g33kz0r

1
OK, vuoi più critiche? (1) Perché nel mondo stai dicendo ssh localhost? Sta solo confondendo l'acqua, non rendendola più chiara. (2) Non mostrando il reindirizzamento nell'esempio modificato, si pone la questione se si sa come raggruppare i comandi e inviare tutto l'output in un file. ... (proseguendo)
Scott,

1
(Proseguendo) ... (3) Ti sei perso il punto, concentrandoti sulla frase "una singola riga di testo". Il mio punto era che l'OP potrebbe voler fare qualcosa di più sofisticato della scrittura di testo noto nel file remoto: potrebbe voler eseguire un comando locale e inviare l'output al file remoto, come in . Se puoi adattare la tua risposta per affrontare quel caso generale, ti preghiamo di farlo. command (localhost) > file (remotehost)
Scott,

6

È anche possibile usare dd per aggiungere un file. Forse un po 'oscuro ma utile se il reindirizzamento dell'output sull'host remoto non è possibile.

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

In questo esempio viene aggiunta la chiave pubblica al file authorized_keys sull'host remoto.

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


3

Questo prenderà il contenuto degli appunti su un Mac e lo aggiungerà alla fine di un file da remoto:

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

Ciò consente di scrivere (aggiungere) alla fine di un file su un host remoto:

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

1

Se deve essere utilizzato più volte potrebbe essere più semplice utilizzare questo codice. Con lo strumento "sshpass", ssh non ti chiederà una password per ogni invocazione dello script. (a meno che non sia necessario tenerlo segreto, quindi meglio non usarlo)

Per maggiori informazioni su 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

Più intuitivo di cosa? Questo è essenzialmente lo stesso della risposta di g33kz0r (di quasi due anni fa), oltre ad alcune campane e fischi che non sono particolarmente chiari. Almeno spiega le cose che hai aggiunto.
Scott,

Se il tuo script viene invocato con troppi argomenti, viene emesso un messaggio di errore che dice che ci sono troppi argomenti.
G-Man dice 'Reinstate Monica',

Sì, è quasi lo stesso che hai ragione. L'unica cosa che aggiunge è che è un po 'più facile da usare (se necessario più volte). E sì, il messaggio di errore non è buono, lo risolverò.
sergeyrar,

1

Puoi semplicemente usare vio nanoo l' picoeditor:

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

Tuttavia, dovrai scriverlo Some Textnell'editor da solo, quindi questo processo non è realmente compatibile con i batch.


-1

Crea uno script come di seguito:

# !/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

Vedo il downvote - molto probabilmente da qualcuno che non utilizzerà un nuovo comando come yumsenza un'ottima ragione. Questa risposta mostra come ma non perché. (Annullamento del downvote per il momento - Spero che lo modifichi per fornire più contesto)
SDsolar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.