リモートサーバーからrootとしてコマンドを実行し(sudoを介して)、標準出力(標準エラーではない)をファイルにキャプチャしようとしています。
例えば。このような:
ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz
リモートでルートアクセスが必要ない場合:
ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
パスワードがないと、rootとしてログインできないため、su
またはを使用できませんssh root@server
。
上記のコマンドを実行すると、次のような結果が表示されます。
$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified
ttyを割り当てるためにsshを追加し、-t
sudo root-file.tar.gz
(およびgzipですが--forceも可能です)から出力を取得するので、リモートのstdoutとstderrをローカルのstdoutとしてキャプチャするようです。
$ ssh -t user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
(hangs)
$ cat root-file.tar.gz
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
[sudo] password for user:
私はsudoerでNOPASSWDを使って特定のコマンドをホワイトリストに追加しています。これは定期的に表示されるスクリプトには適していますが、時々他の任意のコマンドでこのようなことをしたいので、永久にNOPASSWDを追加することはできません。 。
答え1
-Sオプション[0]をsudoに渡すことで、ttyを要求せずにstdinでパスワードを受け入れることができます。
これによりパスワードが端末にエコーされる可能性があるため、直接エコーをオフにしてください。
$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
[sudo] password for user:
$
[0]からマンページ:-S(stdin)オプションを使用すると、sudoは端末デバイスの代わりに標準入力からパスワードを読み込みます。パスワードの後には改行文字が続きます。