2016-09-24 4 views
1

今私は、SSHを介してリモートサーバーにファイルを作るのが好き と私はリモートホストで実行されるsudoの標準出力を抑制する方法は?

function dummy_function() { 
    ssh [email protected] "touch -p /home/user/test_dir" 
    ssh -q -t [email protected] "sudo chmod 744 /home/user/test_file" 
    if [[ $? -eq 0 ]]; then 
    echo "log: success" 
    else 
    echo "log: failure" 
    fi 
} 

機能上の関数の許可を変更したい考えは簡易版で、ログのエコーは一例です。だから、気にしないでください。

私の問題は、sudoがログレコードと混在することによって生成されるプロンプトです。例えば

、上記の出力は、

[sudo] password for user: 
log: success # or log: failure 

ことができる私はそれが須藤の迅速な抑制が、私は、入力されたパスワードに失敗したとき、 ログメッセージが汚染され、

ssh -q -t [email protected] "sudo --prompt='' chmod 744 /home/user/test_file" 

を試し

Sorry, try again. 
log: success # or log: failure 

sudoからエラーメッセージが表示されます。申し訳ありません、もう一度お試しください標準出力に出力されます。 sudoに続くコマンドが標準出力を通していくつかのメッセージを提供する場合、標準出力を閉じるのは嫌いです。リモートホストのsudoからのメッセージだけを表示しないようにするにはどうすればよいですか?

ありがとうございました。

答えて

1

SSHが擬似ttyを作成すると、リモートコマンドのすべての出力が一緒に標準出力に結合されます。それらを分離する方法はありません。

-Sフラグを指定してsudoを実行すると、ttyの代わりに標準エラーと標準を使用するように、特定の問題を解決できるはずです。そうすれば、疑似ttyなしでsshを実行することができ、標準エラーになるsudoプロンプトのログを避けることができます。入力時にパスワードが画面に表示されないようにするには、readコマンドに標準で接続できます。このような何か作業をする必要があります:

ssh -q [email protected] "sudo -S chmod 744 /home/user/test_file" < <(read -s && echo $REPLY) 

勿論、read入力のリダイレクトが唯一それが故障する前にパスワードを正しく入力する時にあなたに1つのショットを与えること。また、他のコマンドで標準入力にアクセスすることもできません。それがあまりにも制限的な場合は、おそらくexpectスクリプトのような、もっと複雑な作業をしなければならないかもしれません。

関連する問題