【问题标题】:Automating remote interactive prompt [duplicate]自动化远程交互提示[重复]
【发布时间】:2019-11-29 17:38:39
【问题描述】:

我正在尝试自动化 SSH bash 脚本来检查我的服务器是否能够通过 SSH 远程设备。我无法安装任何第三方工具,例如 sshpass、expact 或 Net:SSH,因为我的组织不允许这样做。

我创建了一个包含 IP 地址的 ip.txt 文件。脚本将选择第一个 IP 并 SSH 设备。在下一步中,我想提供任何命令说日期和最后退出。一切顺利,直到我提供退出命令。 “退出”命令终止整个脚本,而不是进入下一个循环/IP。

即使在远程设备提示符上提供退出命令后,是否有任何方法可以继续执行脚本?

但是,以下命令有效:ssh username$IP "date && exit" 但我有不同的命令要在不同的服务器上运行。

代码可以正常工作,但是当提供退出命令时,shell 脚本会被终止。

#!/bin/bash
for IP  in `cat /home/ip.txt`
do
echo "Going to SSH first $IP"
ssh username@$IP
date >> log.txt
exit >> log.txt
echo "Completed first loop for $IP"
done

我想手动输入命令,并希望脚本在提供退出命令时不终止。

【问题讨论】:

标签: linux bash shell


【解决方案1】:

正如@rolandweber 指出的那样,发生错误是因为您在本地执行exit 命令。它应该看起来像这样:

#! /bin/bash
username=username
iplist=ip.txt
logfile=log.txt
while IFS= read -r ip; do
        echo "Testing $ip"
        echo -n "$ip: " >> $logfile
        serverdate="$(ssh $username@$ip <<-EOF
        date
EOF
)"
        error=$?
        echo "$serverdate ($error)" | tail -1 >> $logfile
done < $iplist

请注意,您可以缩进 EOF,但 here-doc 中的命令必须与制表符对齐。

【讨论】:

  • 谢谢 Roland 和 Bayou。
  • 但我的要求略有不同。当我对 Windows 设备进行 SSH 连接时,即使在提供用户名和密码之后,它也会给我另一个管理员提示输入密码。此管理员提示确认我能够通过 SSH 连接设备。所以我想传递一个终止信号,以便它可以避免管理员提示并进入第二个循环。另外,有什么方法可以在日志文件中记录提示,就像我在这里得到管理员提示一样?
  • 我认为不可能省略。对于此类问题,您必须使用expect,因为它可以让您与 shell 交互(发送密码和东西)。将exit 添加到here-doc 对您没有帮助,因为在date 执行之前需要密码(我猜)。但是,如果您要连接的每台服务器都有一个 ssh 密钥,您可以使用 (timeout)[man7.org/linux/man-pages/man1/timeout.1.html]。不,我不知道是否有办法在日志文件中记录提示;我根本不使用 Windows:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多