web-dev-qa-db-ja.com

ssh、Sudo、shを通過するときにリダイレクトが失敗するのはなぜですか?

この質問 を読んだ後、私はしなければならないことを知っています

Sudo sh -c 'ls -hal /root/ > /root/test.out'

「アクセスが拒否されました」エラーを回避するため。

しかし、私がするとき

ssh hostname Sudo sh -c 'ls -hal /root/ > /root/test.out'

別のマシンから、私は得る

bash: /root/test.out: Permission denied

どうして?そして、どうすればこれを機能させることができますか?

編集:行があります

Defaults:<username>    !requiretty

<username> ALL= NOPASSWD: ALL

/etc/sudoers

できます

ssh remote-machine 'Sudo ls /'

問題なく。だから私はそれがttyの問題ではないと思います。 -tを追加しても、問題は解決しません。

5
Fabien

問題は、引用符がリモートシェルではなく、ローカルシェルによって解釈および削除されることです。追加のレベルが1つ必要です。

ssh Host Sudo sh -c '"ls -hal /root/ > /root/test.out"'

ローカルシェルは1レベルの引用符を消費します-単一引用符はここで「使い果たされ」、sshは引数HostSudosh-c、および"ls -hal /root/ > /root/test.out"を取得します。

リモートシェルは次のレイヤー(二重引用符)を消費し、Sudo-c、およびls -hal /root/ > /root/test.outを使用してshを呼び出します。

最後に、shインスタンス(rootとして実行)が-cおよびls -hal /root/ > /root/test.outで呼び出され、その単一の引数を通常のコマンドラインとして解析して、リダイレクトを評価します。

これらすべてを監視するには、ターゲットシステムでSudo strace -f -e execve -p $(cat /var/run/sshd.pid)を実行してみてください。

6
Gabe