【发布时间】:2015-06-27 20:47:27
【问题描述】:
我正在创建一个脚本,该脚本从 host-A 执行以连接到远程 host-b,在 host-b 上运行一个 bash 脚本(从顶部生成监控数据等),并将输出附加回主机-A 上的文件。虽然我使用 ssh 进行连接,但我不会使用 ssh-keys,因为环境中的服务器太多了。
我的期望脚本:
"#!/usr/bin/expect
"#!/usr/bash
set timeout 10
set hostname [sample_hostname]
set user "(sample_user)"
set password "(sample_password)"
spawn ssh $user@$hostname /path/to/bash/script/script.sh | cat >> /tmp/file
expect "Password:"
send "$password\r";
expect "$"
====================================
上述脚本将 bash 脚本的输出附加到 host-B /tmp/file,而不是所需的 host-A /tmp/file。如何更改以将脚本附加到主机 A 而不是主机 B?
附言
- 手动登录host-A
- cd 到脚本位置
- 运行 ssh user@hostname /path/to/script/script.sh | cat >> /tmp/file on host-A
- cat /tmp/file
以上手动步骤按需要执行;因此我认为问题出在预期中的 bash 上。
感谢任何想法!
问候,
艾伦
【问题讨论】:
-
如果您确实让
expect工作,我建议您使用它一次 来填充您的~/.ssh/authorized_keys文件,然后放弃期望以支持基于密钥的身份验证。 -
我认为问题在于您希望
spawn为您运行一个shell。我不相信它会那样做。尝试在主机 A 上的expect脚本外部进行重定向。还有为什么| cat?那个管道对你有什么用? -
它的行为与您的预期不同。
spawn语句中的所有参数都被视为第一个参数ssh的参数,这使得重定向成为生成的远程会话的一部分。你的问题是这个问题的变体stackoverflow.com/questions/12220447/… -
ghoti - 谢谢。不幸的是,现在将 ssh 密钥存储在盒子中是不可能的,因为我们有 50 多个盒子,并且添加新盒子后的可扩展性不是很好。
-
Etan - 尝试取出 |猫;脚本仍在附加到 host-b 并且 >> 正在附加 bash 输出而不是脚本的输出。我想我需要它来写入主机 A 并显示正确的输出。我将把 ssh 排除在外,看看。谢谢!
标签: linux bash shell ssh expect