SSHで`cd`コマンドが機能しないのはなぜですか?

SSHで`cd`コマンドが機能しないのはなぜですか?

SSHを介して一部のファイルをバックアップしようとしていますが、目的のtarファイルをバックアップするのではなく、ホームフォルダがバックアップされます。私はいくつかの追加テストを行いましたが、結果は次のとおりです。

ssh root@server /bin/sh -c "cd /boot && ls -l"

驚くべきことに、ファイルがリストされています。/rootいいえ/boot。ただし、/bin/sh端末で完全なコマンドを実行するとcd正しく機能し、/bootファイルが印刷されます。

ここで何が起こっているのでしょうか?

ベストアンサー1

sshでは、リモートホストのexecvpに渡される一連の引数と同じくらい正確にコマンドを指定することはできません。代わりに、すべての引数を文字列で連結し、リモートシェルを介して実行します。私の考えでは、これはsshの主な設計上の欠陥です。ほとんどの点でうまく機能するUnixツールですが、コマンドを指定する時が来たら、argvの代わりに単一の単一文字列を使用するように選択します。 MSDOS用に設計されています!

sshはコマンドを単一の文字列として渡すため、sh -c直接提供する必要はありませんsh -c

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

元の参照が失われます。したがって、区切り文字を持つコマンドは次&&のようになります。

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

$0最初はコマンドテキスト "cd"と=を使用してシェルを実行します"boot"。 "cd"コマンドは正常に完了し、重要ではなく、$0成功を/bin/sh -cマークしてからls -l発生します。

おすすめ記事