创建可以导入变量并针对外部文本文件中的变量执行代码的bash脚本

时间:2019-01-31 10:32:47

标签: linux bash shell

我有一个文本文件,其中包含未使用的PC网络上的所有主机名。我正在创建一个维护脚本,该脚本将在早上运行以重新启动计算机。

我尝试了一些将SSH SSH到计算机并重新启动它的代码,但是我只能手动执行此操作。

重新启动计算机的代码为ssh hostname echo "password" | sudo -S reboot

我已经创建了一个bash脚本并测试了变量,以确保它逐行输出主机名。但是当我将下面的代码放在下面时,它行不通

#!/bin/bash
file="/home/ubuntu/Desktop/hostnames.txt"
while IFS= read -r ipaddress
do
 ssh "$ipaddress" echo "password | sudo -S reboot"
done <"$file"

我希望代码一步一步地执行该命令以重新启动机器,因为如果我手动执行该命令,则可以完成。但是我收到一个错误

Line 7 Unexpected EOF while looking for matching '"'
Line 8 Syntax Error: Unexpected End of File.

任何指导表示赞赏。

编辑-意识到我在ssh命令中错过了一个'

1 个答案:

答案 0 :(得分:0)

错误似乎出在您正在执行的ssh命令中。

执行远程命令的方式如下:

ssh [user]@$ipaddress "echo $password | sudo -S reboot"

使用本地使用的相同用户名登录时,可以省略[user]。还要确保在脚本中的某个位置设置了$password变量:

#!/bin/bash
file="/home/ubuntu/Desktop/hostnames.txt"
user="my-server"
password="my-secret" 

while IFS= read -r ipaddress
do
 ssh "$user@$ipaddress" "echo $password | sudo -S reboot"
done <"$file"

实际上,您可能不应该将密码存储在脚本中,因此您可能想要添加密码提示,如下所示:

echo -n Password: 
read -s password
echo
# Run Command
# ...

将其组合在一起将使您:

#!/bin/bash
file="/home/ubuntu/Desktop/hostnames.txt"
user="my-server"

echo -n Password: 
read -s password
echo

# Run Command
while IFS= read -r ipaddress
do
 ssh "$user@$ipaddress" "echo $password | sudo -S reboot"
done <"$file"