So schreiben Sie mit SSH aus der Ferne in eine Datei

41

Ich kann eine Datei problemlos auf einen entfernten Linux-Rechner kopieren

scp file user@host: /pathtowrite_file

Ich habe jedoch Schwierigkeiten, von einem Linux-Computer auf einen anderen in eine Datei zu schreiben. Folgendes habe ich versucht:

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

Die Nachricht, die ich bekomme, ist

stdin: ist keine tty

In jedem Fall gibt die Datei auf dem Remote-Computer nicht den gesendeten Text "Some Text" wieder.

Suffa
quelle

Antworten:

70

Sie können den Befehl "cat" verwenden, um die entfernte Datei zu erstellen.

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

Das -Tdeaktiviert die Pseudo-Terminal-Zuordnung und verhindert, dass Sie die Nachricht erhalten.

Pseudo-Terminal wird nicht zugewiesen, da stdin kein Terminal ist.

Aragorn
quelle
Ich möchte jedoch in die vorhandene Datei auf dem Remotecomputer schreiben.
Suffa
2
Die Datei "cat> /remotefile.txt" wird auf dem Remotecomputer ausgeführt. Wenn Sie eine vorhandene Datei anhängen möchten, ersetzen Sie ">" durch ">>"
Aragorn
@suffa: Versuchen Sie, an eine vorhandene Datei anzuhängen? Oder möchten Sie die Datei überschreiben, aber fehlschlagen, wenn sie noch nicht vorhanden ist? Oder was?
David Schwartz
@ David Schwartz - entweder. Ich würde gerne überschreiben und scheitern, wenn es nicht beendet wird ... aber ich würde an dieser Stelle nur das Anhängen nehmen.
Suffa
`echo 'Some Text' | ssh user @ remotehost" tee -a /remotefile.txt "` hat auch bei mir funktioniert.
Einfach Seth
10

Ein bisschen kürzer als die andere Antwort:

ssh user@remotehost "echo Some Text > /remotefile.txt"
g33kz0r
quelle
3
Wahr; Dies wird funktionieren - wenn das Schreiben einer einzelnen Textzeile in die entfernte Datei wirklich alles ist, was das OP tun möchte. Der Befehl in der Frage sieht aus wie ein Proof-of-Concept-Test. Die Frage lautet: "Schreiben in eine Datei von einem Linux-Computer auf einen anderen." Wenn der Benutzer einen beliebigen Befehl (oder eine Folge von Befehlen) - und nicht nur einen echo- lokal ausführen möchte, hilft Ihre Antwort nicht, und die akzeptierte Antwort ist der Weg, dies zu tun.
Scott
@Scott Mit diesem Ansatz sind auch mehrere Befehle möglich. Wie die meisten Dinge Linux, TMTOWTDI: ssh localhost "echo 'hi'; echo 'hello'; echo 'well, hello there!'
g33kz0r
Cooler Typ, danke für die Ablehnung. Ich vermute, das ist einfacher, als meinen Standpunkt tatsächlich anzusprechen. PS Ihr Kommentar oben macht keinen Sinn.
g33kz0r
1
OK, du willst mehr Kritik? (1) Warum in aller Welt sagst du ssh localhost? Das macht das Wasser nur trüb und nicht klarer. (2) Wenn Sie in Ihrem geänderten Beispiel keine Umleitung anzeigen, stellen Sie sich die Frage, ob Sie Befehle gruppieren und die gesamte Ausgabe an eine Datei senden können. … (Fortsetzung)
Scott
1
(Fortsetzung)… (3) Sie haben meinen Standpunkt verfehlt, indem Sie sich auf den Satz „eine einzelne Textzeile“ konzentriert haben. Mein Punkt war, dass das OP etwas ausgefeilteres als das Schreiben von bekanntem Text in die entfernte Datei tun möchte - er möchte möglicherweise einen lokalen Befehl ausführen und die Ausgabe an die entfernte Datei senden, wie in . Wenn Sie Ihre Antwort an diesen allgemeinen Fall anpassen können, tun Sie dies bitte. command (localhost) > file (remotehost)
Scott
6

Es ist auch möglich, dd zum Anhängen an eine Datei zu verwenden. Möglicherweise etwas unklar, aber nützlich, wenn die Ausgabeumleitung auf dem Remote-Host nicht möglich ist.

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

In diesem Beispiel wird Ihr öffentlicher Schlüssel an die Datei authorized_keys auf dem Remote-Host angehängt.

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

SDL
quelle
3

Dadurch wird der Inhalt Ihrer Zwischenablage auf einem Mac übernommen und an das Ende einer Datei angehängt:

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

Auf diese Weise können Sie an das Ende einer Datei auf einem Remote-Host schreiben (anhängen):

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

Wenn dieser Code mehrmals verwendet werden muss, ist er möglicherweise einfacher zu verwenden. Mit dem Tool "sshpass" fordert ssh Sie nicht bei jedem Aufruf des Skripts zur Eingabe eines Kennworts auf. (es sei denn, Sie müssen es geheim halten, dann besser nicht verwenden)

Weitere Informationen zu sshpass finden Sie unter 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
quelle
Intuitiver als was? Dies ist im Wesentlichen das Gleiche wie die Antwort von g33kz0r (vor fast zwei Jahren), plus ein paar Schnickschnack , die nicht besonders klar sind. Erkläre wenigstens das, was du hinzugefügt hast.
Scott
Wenn Ihr Skript mit zu vielen Argumenten aufgerufen wird, wird eine Fehlermeldung ausgegeben, die besagt, dass zu wenige Argumente vorhanden sind.
G-Man sagt, dass Monica
Ja, es ist fast dasselbe, mit dem Sie Recht haben. Die eine Sache, die hinzugefügt wird, ist, dass es ein bisschen einfacher zu bedienen ist (wenn es mehrmals benötigt wird). Und ja die Fehlermeldung ist nicht gut, ich werde es beheben.
Sergeyrar
1

Sie können einfach vioder nanooder picoeditor verwenden:

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

Sie müssen dann jedoch Some Textselbst in den Editor schreiben , sodass dieser Vorgang nicht wirklich batch-kompatibel ist.

Riptide9.7
quelle
-1

Erstellen Sie ein Skript wie folgt:

# !/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
quelle
Ich sehe die Ablehnung - höchstwahrscheinlich von jemandem, der einen neuen Befehl wie yumohne einen sehr guten Grund nicht verwendet. Diese Antwort zeigt, wie, aber nicht warum. (Stornieren Sie die Abstimmung für den Moment - ich hoffe, Sie werden diese bearbeiten, um mehr Kontext bereitzustellen)
SDsolar