it-swarm.com.de

Warum funktioniert der Befehl "cd" nicht über SSH?

Ich habe versucht, einige Dateien über SSH zu sichern, aber anstatt tar die Dateien zu verwenden, die ich wollte, habe ich meinen Home-Ordner erhalten. Ich habe einige weitere Tests durchgeführt und es läuft darauf hinaus:

ssh [email protected] /bin/sh -c "cd /boot && ls -l"

Was zu meiner Überraschung Dateien in /root nicht /boot. Aber wenn ich das ganze /bin/sh Befehl von einem Terminal es richtig cd s und druckt das /boot Dateien.

Was passiert hier?

41
Ambroz Bizjak

mit ssh können Sie einen Befehl nicht genau wie eine Reihe von Argumenten angeben, die an execvp auf dem Remote-Host übergeben werden sollen. Stattdessen werden alle Argumente zu einer Zeichenfolge verkettet und über eine Remote-Shell ausgeführt. Dies ist meiner Meinung nach ein großer Konstruktionsfehler in ssh ... es ist in vielerlei Hinsicht ein gut erzogenes Unix-Tool, aber wenn es darum geht, einen Befehl anzugeben, wird eine einzelne monolithische Zeichenfolge anstelle einer argv-Zeichenfolge verwendet es wurde für MSDOS oder so etwas entwickelt!

Da ssh Ihren Befehl als einzelne Zeichenfolge an sh -c Übergibt, müssen Sie kein eigenes sh -c Angeben. Wenn Sie dies tun, ist das Ergebnis

sh -c '/bin/sh -c cd /boot && ls -l'

mit dem ursprünglichen Zitat verloren. Die durch && Getrennten Befehle lauten also:

`/bin/sh -c cd /boot`
`ls -l`

Die erste davon führt eine Shell mit dem Befehlstext "cd" und $0 = "boot" Aus. Der Befehl "cd" wird erfolgreich ausgeführt, der $0 Ist irrelevant und der /bin/sh -c Zeigt den Erfolg an, dann passiert der ls -l.

36
user41515

Es ist ein Zitat Problem. Ssh führt den Befehl, den Sie übergeben, bereits in einer Shell aus. Wenn Sie mehrere Parameter übergeben, werden diese mit einem Leerzeichen dazwischen verknüpft, um eine Zeichenfolge zu erstellen. Der Remote-Befehl, den Sie remote ausführen, lautet also /bin/sh -c cd /boot && ls -l (Keine Anführungszeichen, da die Anführungszeichen in Ihrem Befehl von der lokalen Shell interpretiert wurden).

/bin/sh -c cd /boot Führt /bin/sh Aus und weist es an, den Befehl cd auszuführen und $0 Auf /boot Zu setzen. Sobald dies erledigt ist, führt die übergeordnete Shell (die von sshd gestartete) ls -l Aus.

Entfernen Sie in Ihrem Fall einfach das sh -c, Das völlig nutzlos ist, es sei denn, Ihre Remote-Shell (wie in /etc/passwd Oder einer anderen Kennwortdatenbank angegeben) versteht diesen Befehl nicht.

ssh [email protected] "cd /boot && ls -l"

Wenn Sie eine andere Shell aufrufen müssen, müssen Sie den Befehl remote angeben, um sie vor der Erweiterung durch die von sshd aufgerufene Remote-Shell zu schützen. Wenn Ihre Anmeldeshell beispielsweise ein Bindestrich ist und Sie einen Bash-Befehl ausführen möchten:

ssh [email protected] 'bash -c "cd ~bob && ls -l"'

Ich denke, es hat mehr damit zu tun, wie die Optionen von der Shell analysiert werden. Zum Beispiel funktioniert dies:

$ ssh [email protected] /bin/sh -c '"cd /boot && ls -l"'

Dies hat das gleiche Problem wie Ihr Befehl:

$ ssh [email protected] /bin/sh -c 'cd /boot && ls -l'

Wenn Sie das -v wechsle zu ssh du kannst sehen was los ist:

1. Befehl:

debug1: Befehl senden:/bin/sh -c "cd/boot && ls -l"

2. Befehl:

debug1: Befehl senden:/bin/sh -c cd/boot && ls -l

In der Regel müssen Sie beim Senden von Befehlen über ssh besonders auf die Anführungszeichen achten und Anführungszeichen in Anführungszeichen setzen, da die verschiedenen Ebenen sie entfernen. Senden Sie auch nicht /bin/sh.

Sie können sehr nützliche Dinge tun, wenn Sie das Zitieren von ssh wie das folgende verstanden haben. Dadurch wird der Befehl auf dem Remote-Server ausgeführt, die Ergebnisse werden jedoch in einer Datei lokal auf dem System erfasst, auf dem Sie den Befehl ssh ausgeführt haben:

$ ssh [email protected] 'free -m' > /tmp/memory.status

oder dies, wo Sie ein Verzeichnis auf einem Remote-Server tarieren und auf dem lokalen System erstellen:

$ ssh remotehost 'tar zcvf - SOURCEDIR' | cat > DESTFILE.tar.gz

Verweise

8
slm

Normalerweise müssen Sie nicht angeben, welche Shell verwendet werden soll. Das funktioniert:

ssh [email protected] "cd /boot && pwd"

Wenn Ihre Standard-Shell jedoch problematisch ist, stellen Sie sicher, dass Sie den Befehl gesamt einschließlich des Shell-Aufrufs angeben. Eine der folgenden Arbeiten

ssh [email protected] '/bin/sh -c "cd /boot && pwd"'
ssh [email protected] "/bin/sh -c \"cd /boot && pwd\""
5
tylerl