2015-08-14 37 views
0

所以這裏是我的問題,我有我寫這個腳本,我在哪裏出口兩個變量,但他們沒有把它變成子殼。有一個問題傳遞變量到subshel​​l

該腳本的目的是爲CentOS和Ubuntu主機更改用戶密碼並清除它們的pam_tally。

有一點背景是,這個環境的用戶是由puppet管理的,但密碼都是本地的,ssh密鑰也是不允許的(這是設置在石頭上,不能改變,所以我必須與我得到的東西一起工作),原因是每次登錄都必須是手動的(甚至會話數限制爲兩個,所以你甚至不能有效地使用csshX)。

這裏是我的腳本

#!/bin/bash 

echo "Please enter user whose password you want to change" 
read NEWUSER 
echo "Please enter new password for user" 
read -s -p "Temp Password:" TEMPPASSWORD 

PASSWORD=$TEMPPASSWORD 
export PASSWORD 
NEWUSER2=$NEWUSER 
export NEWUSER2 

for i in HOST{cluster1,cluster2,cluster3}0{1..9} 
do 

ping -c 2 $i && (echo $i ; ssh -t $i ' 

sudo pam_tally2 --user=$NEWUSER2 --reset 

echo -e "$PASSWORD\n$PASSWORD" | sudo passwd $NEWUSER2 

sudo chage -d 0 $NEWUSER2 

') 

done 

回答

2

您正在使用ssh連接到遠程主機並運行該主機上的腳本。 ssh不會將本地環境導出到遠程會話,而是在遠程主機上執行登錄,該遠程主機根據遠程主機上的遠程用戶配置來設置環境。

我建議你通過你想執行的命令來傳遞所有需要的值。這可以這樣做:

ssh -t $i ' 
    sudo pam_tally2 --user='"$NEWUSER2"' --reset 
    echo -e "'"$PASSWORD"'\n'"$PASSWORD"'" | sudo passwd '"$NEWUSER2"' 
    sudo chage -d 0 '"$NEWUSER2" 

仔細觀察它如何使用引號。在每次使用變量的場合,我終止單引號字符串(使用'),然後添加變量的雙引號用法(例如"$PASSWORD"),然後再次啓動單引號字符串(再次使用')。這樣,執行ssh命令的shell將已經擴展變量,因此您不需要將它們傳遞到遠程shell。

但要注意的是,在密碼中的特殊字符(如"'也許一堆其他的字符)可能意味着使用這種簡單的機制麻煩。爲了對抗這種安全,以及,你就需要使用printf命令的%q格式說明經過之前引用你的價值觀:

ssh -t "$i" "$(printf ' 
    sudo pam_tally2 --user=%q --reset 
    { echo %q; echo %q; } | sudo passwd %q 
    sudo chage -d 0 %q' \ 
    "$NEWUSER2" "$PASSWORD" "$PASSWORD" "$NEWUSER2" "$NEWUSER2")" 
+0

感謝這個,這是一個很大的幫助。 – Kevin