この質問 を読んだ後、私はしなければならないことを知っています
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を追加しても、問題は解決しません。
問題は、引用符がリモートシェルではなく、ローカルシェルによって解釈および削除されることです。追加のレベルが1つ必要です。
ssh Host Sudo sh -c '"ls -hal /root/ > /root/test.out"'
ローカルシェルは1レベルの引用符を消費します-単一引用符はここで「使い果たされ」、sshは引数Host
、Sudo
、sh
、-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)
を実行してみてください。