【问题标题】:Bash Script read hostnames from .txt file and place in variable for sshBash 脚本从 .txt 文件中读取主机名并将其放入 ssh 的变量中
【发布时间】:2014-10-11 12:47:10
【问题描述】:

我创建了一个如下的 Bash 脚本:

File=/library/logs/file.txt
ssh -n username@<ip> "$(< testscript.sh)" > $File 

它将远程进入机器并运行脚本并将输出放在 file.txt 我现在需要做的不是手动输入 IP 地址,而是需要从来自 .txt 文件的主机名列表中读取它,并将其放置在一个替代 IP 地址的变量中。一个例子是:ssh username@Variable,其中每次从包含主机名的文件中读取一个单词时,“变量”都会发生变化。有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: linux macos bash ssh


    【解决方案1】:

    将 xargs 与 -I 一起使用

    cat hosts.txt | xargs -I %REPL ssh user@%REPL
    

    -I 定义了一个“替换字符串”,在本例中为“%REPL”(但您可以将其设置为您喜欢的值)。 然后,该特定字符串将在命令中替换为输入中的每一行。

    我喜欢的另一种方式是使用 printf

    echo -e "host1.com\nhost2.com" | xargs -n1 printf "ssh user@%s -p 999\n"
    

    如果您想在同一命令中使用更多行,这尤其棒。想象一下,您有一个文件,其中用户名在第 1 行,主机名在第 2 行。您可以这样做:

    xargs -n2 printf "ssh %s@%s -p 999\n" < user_and_host.txt
    

    密码

    所有这一切,假设您使用的是 SSH 密钥,因为 按照设计,openssh 客户端不会让您“编写”密码。

    如果您想使用密码身份验证编写脚本,有很多提示和方法(现在有人会大喊“期待”)。但我在某个时候都做了这些,它们带来了永远的痛苦和消化不良

    不值得,自己编写脚本。看看我最喜欢的工具:

    这将使您几乎可以做您需要的事情。给它用户名、密码、一个或多个运行命令+一堆主机/IP。完成后,您将拥有一个漂亮的 CSV 文件,其中包含每个命令的结果,由其主机排序。

    【讨论】:

    • 或者干脆xargs -I %REPL ssh user@%REPL &lt; hosts.txt
    • 效果很好,谢谢,现在我将如何自动为我输入密码,而不是每次都输入密码才能进入 ssh?有没有办法在提示“密码:”时自动输入我的密码?
    • 如果它没有连接到网络,还有没有办法让它跳过主机名?看起来它给了我这个错误“端口 22:操作超时”,然后取消运行所有其他主机名
    • 我怀疑有问题,如果hosts.txt文件中有多个主机。从第二台主机开始的行将作为 ssh 命令的输入提供。我建议for host in $(&lt; host.txt); do ssh@$host ... ; done 或为host.txt 文件创建一个单独的文件描述符并从中读取。
    • @Technic1an Ahh..“脚本化 ssh 密码”问题。这确实是一个非常古老的版本,我确信可以在堆栈交换中找到许多重复项。通常你可以使用“expect”,但说实话,自己编写代码真的不值得。我会稍微修改一下我的答案,并提出建议。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2023-02-22
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多