从txt文件执行命令

从txt文件执行命令

我有文件,在这个文件中我有以下几行:

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.comserver1.comssh [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。养成这样的习惯在变量替换周围加上双引号

    您可能会得到更好的服务在多台机器上执行相同命令的框架

相关内容