還有其他線程使用同一主題,但我的問題是唯一的。我正在運行一個bash腳本,該腳本具有一個連接到遠程服務器並在遠程服務器上運行sudo命令的功能。我正在使用ssh -t選項來避免requiretty問題。只要沒有在while循環中調用代碼,違規代碼行就可以正常工作。 while循環基本上都是從本地服務器上的CSV文件中讀取並調用checkAuthType功能:僞終端錯誤將不會分配,因爲stdin不是終端 - sudo
while read inputline
do
ARRAY=(`echo $inputline | tr ',' ' '`)
HOSTNAME=${ARRAY[0]}
OS_TYPE=${ARRAY[1]}
checkAuthType $HOSTNAME $OS_TYPE
<more irrelevant code>
done < configfile.csv
這是在腳本的頂部位於(以外的任何while循環)功能:
function checkAuthType()
{
if [ $2 == linux ]; then
LINE=`ssh -t $1 'sudo grep "PasswordAuthentication" /etc/ssh/sshd_config | grep -v "yes\|Yes\|#"'`
fi
if [ $2 == unix ]; then
LINE=`ssh -n $1 'grep "PasswordAuthentication" /usr/local/etc/sshd_config | grep -v "yes\|Yes\|#"'`
fi
<more irrelevant code>
}
因此,有問題的行是在函數中具有sudo命令的行。我可以將命令更改爲「sudo ls -l」之類的簡單命令,而且我仍然會看到「stdin不是終端」錯誤。我也嘗試過「ssh -t -t」,但無濟於事。但是如果我從while循環之外調用checkAuthType函數,它可以正常工作。什麼是while循環改變終端,我該如何解決它?提前一千多次感謝你。
這是解決方案!我將嘗試將csv文件讀入一個變量,而不是逐行讀取它,然後使用for循環遍歷數組值。不知道這是否會奏效,但這個解決方案要簡單得多。非常感謝! – Isaac