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

标签 linux bash shell

<分区>

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

我已经尝试了一些可以通过 SSH 连接到机器并重新启动它的代码,但是我只能手动执行此操作。

重启机器的代码是ssh hostname echo "password"| sudo -S 重启

我创建了一个 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 命令中遗漏了一个“

最佳答案

错误似乎出在您正在执行的 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"

关于linux - 创建可以导入变量并针对来自外部文本文件的变量执行代码的 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54458549/

相关文章:

PHP-Fpm.d 与 nginx ,如何在 shell exec 中运行 sudo

bash - 将 stdin 作为另一个文件添加到 tar 存档

bash - 如果设置则使用环境变量,否则使用 makefile 中的默认值

Bash:有什么方法可以提取该字符串的第一部分吗?

c - 在 C 中使用 fgets 的段错误

php - 创建一个 shell 脚本以在 ubuntu 中从 php 运行 sqlite 命令

linux - Bash EOF 有意外行为

linux - CentOS:为什么 'cma' 进程占用这么多内存?

linux - 如何在 Linux 上将原始数据直接写入 usb 打印机?

c - shell get segmentation fault 实现历史