【问题标题】:bash passing value to remote serverbash 将值传递给远程服务器
【发布时间】:2022-01-14 12:46:34
【问题描述】:

我们有一个文本文件中的服务器和本地用户列表。 我们需要定期更改这些密码。

cat host.txt
user1@server_test
user2@server_test
usera@server_dev
userb@server_dev
usera1@server_pro
userb1@server_pro

我写了以下脚本来修改密码

#!/bin/bash
for i in $(cat host.txt);
do
   userid=`echo $i | awk -F"@" '{print $1}'`
   server=`echo $i | awk -F"@" '{print $2}'`
   ssh $server 'echo -e "tempP@ass\ntempP@ass" | sudo passwd `echo $userid`'
done

此脚本的问题:在远程服务器上变量$userid 的值不可见(我知道原因) 将此值传递给远程服务器的最佳方法是什么?

【问题讨论】:

  • 你为什么要使用echo?不要在反引号中运行echo $userid,只需写$userid。但是如果你想在本地主机上扩展它,你不能使用单引号。

标签: linux bash ssh server script


【解决方案1】:

我不确定你的问题;看来您应该担心远程上的对手可以看到密码,但似乎您的问题只是$userid 的扩展失败。我相信你只是想要:

#!/bin/bash
while IFS=@ read userid server; do
   ssh "$server" "printf 'tempP@ass\ntempP@ass\n' | sudo passwd $userid"
done < host.txt

如前所述,这是非常不安全的,因为密码将在遥控器上可见。您可以通过以下方式缓解这种情况:

#!/bin/bash
while IFS=@ read userid server; do
   printf 'tempP@ass\ntempP@ass\n' | ssh "$server" "sudo passwd $userid"
done < host.txt

【讨论】:

  • 感谢它的工作
  • 嗨,William,我们需要稍作调整,我该如何输入“if [ 'uname -s' == Linux ] then; execute command 1 else execute command 2 fi”这样的条件语句跨度>
  • 您是否尝试在遥控器上运行uname?您应该避免通过ssh 传递的shell 脚本过于复杂,但您基本上可以完全按照您的描述进行操作:ssh "$server" 'if test "$(uname -s)" = Linux; then sudo passwd '"$userid"' ..; fi'。只需确保 $userid 不受单引号保护,因为您希望对它进行插值。
【解决方案2】:

我会使用chpasswd

#!/bin/bash
for i in $(cat host.txt);
do
   userid="`echo $i | awk -F"@" '{print $1}'`"
   server="`echo $i | awk -F"@" '{print $2}'`"
   # ssh root@$server -t "echo $userid:tempP@ass|chpasswd"
   # or as suggested by @chepner
   echo "$userid:tempP@ass" |ssh root@$server -t chpasswd
done

来自man 8 chpasswd

chpasswd 命令从以下位置读取用户名和密码对列表 标准输入并使用此信息更新一组现有的 用户。每一行的格式为:

用户名:密码

【讨论】:

  • 也通过ssh 输入新密码,而不是让它在远程命令行上可见。 echo ... | ssh root@$server -t chpasswd
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 2013-09-13
  • 1970-01-01
  • 2020-08-15
  • 2013-01-12
  • 2015-02-28
  • 1970-01-01
相关资源
最近更新 更多