首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有一个将变量传递给子subshell的问题

有一个将变量传递给子subshell的问题
EN

Stack Overflow用户
提问于 2015-08-14 21:43:02
回答 1查看 2.2K关注 0票数 1

所以这是我的问题,我写了一个脚本,我在这里导出两个变量,但是它们没有被放入子subshell中。

此脚本的目的是更改用户密码,并为CentOS和Ubuntu主机清除他们的CentOS。

一个小小的背景是这个环境的用户是由傀儡管理的,但是密码都是本地的,ssh密钥也是不允许的(这是固定的,不能更改,所以我必须使用我得到的内容),原因是每个登录都必须是手动的(偶数的会话限制在两个,所以您甚至不能有效地使用csshX )。

这是我的剧本

代码语言:javascript
运行
复制
    #!/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
EN

Stack Overflow用户

回答已采纳

发布于 2015-08-14 22:15:58

您正在使用ssh连接到远程主机,并在该主机上运行脚本。ssh不将本地环境导出到远程会话,而是在远程主机上执行登录,根据远程主机上远程用户的配置设置环境。

我建议您通过要执行的命令传递所有需要的值。可以这样做:

代码语言:javascript
运行
复制
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命令的printf格式说明符来引用它们:

代码语言:javascript
运行
复制
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")"
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32019076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档