我有文件,在这个文件中我有以下几行:
ssh [email protected]
ssh [email protected]
etc....
我有一个脚本,我喜欢在每台服务器上运行并在该文件上的每台服务器上执行 ls 命令。我现在所做的是:
while read line;
do
$line
done < $1
它可以工作,但对于第一行,之后它返回一个
伪终端不会被分配,因为 stdin 不是终端。错误。
所以我知道我错过了一些东西,但我在这里有点迷失。
答案1
在文件中添加命令-t
选项:ssh
ssh -t [email protected]
ssh -t [email protected]
etc....
从man ssh
:
-t Force pseudo-tty allocation. This can be used to execute arbi‐
trary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
如果仍然出现错误,请添加另一个-t
选项,例如:
ssh -t -t [email protected]
答案2
您正在执行命令,该命令从标准输入读取命令并在 上执行它们。标准输入连接到您的输入文件,因此您正在执行命令。ssh [email protected]
server1.com
server1.com
ssh [email protected]
如果您想执行该命令ls
,您将需要以ls
某种方式处理您的代码。有两个明智的选择:
如果你想执行任意命令,请将整个命令放入你的输入文件中:
ssh [email protected] ls ssh [email protected] ls
那么你的输入文件是一个shell脚本,只需用 执行它
sh myscript
,或者使其可执行并放在#!/bin/sh
顶部。如果您想在多台机器上执行相同的命令,请使您的输入文件仅包含机器名称,即
[email protected] [email protected]
然后读取机器名称并在每个机器上执行命令:
while read target comment; do ssh "$target" ls </dev/null done <"$1"
重定向是
/dev/null
为了防止远程命令可能尝试读取标准输入,以避免从包含计算机名称列表的文件中读取。列表文件每行可以在服务器名称之后包含其他单词;它们将被填充到变量中comment
。养成这样的习惯在变量替换周围加上双引号。您可能会得到更好的服务在多台机器上执行相同命令的框架。