2016-09-24 19 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時,它將遠程命令的所有輸出合併到標準輸出中。沒有辦法將它們分開。

您應該能夠通過運行sudo-S標誌來解決您的特定問題,以使其使用標準錯誤和標準in,而不是直接使用tty。然後,您可以運行ssh而不使用僞tty,並且您將能夠避免記錄出現標準錯誤的sudo提示符。爲了避免在輸入密碼時將密碼回顯到屏幕上,可以將標準輸入到read命令中。像這樣的東西應該工作:

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

Ofcourse,這read輸入重定向只會給你在正確輸入密碼失敗前一個鏡頭。此外,它不會讓任何其他命令訪問標準輸入。如果這太嚴格了,那麼你可能不得不做更復雜的事情,可能是expect腳本。

相關問題