有一个问题将变量传递给subshel​​l

时间:2015-08-14 21:43:02

标签: linux bash variables global-variables subshell

所以这是我的问题,我写了这个脚本,我写了导出两个变量然而他们并没有把它变成子shell。

此脚本的目的是更改用户密码并清除Centam和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

1 个答案:

答案 0 :(得分:3)

您正在使用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中。

但请注意,密码中的特殊字符(如"'或许多其他字符)可能意味着使用此简单机制时出现问题。为了安全起见,您还需要使用%q命令的printf格式说明符在传递值之前引用它们:

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")"