【问题标题】:SSH command behaving differently in expect scriptSSH 命令在期望脚本中的行为不同
【发布时间】: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?

附言

  1. 手动登录host-A
  2. cd 到脚本位置
  3. 运行 ssh user@hostname /path/to/script/script.sh | cat >> /tmp/file on host-A
  4. 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


【解决方案1】:

如果您的意图是只获取该脚本的输出,请按照以下方式进行。

#!/usr/bin/expect 

set timeout 10

set hostname host
set user dinesh
set password pwd
set script "/home/dinesh/mypgms/demo.sh"
spawn ssh $user@$hostname
expect "password:"
send "$password\r";
expect "\\\$"; # Matching the literal dollar prompt sign of terminal
send "$script\r"
expect -re "\r\n(.*)\\\$"; # Matching the output
# Getting first sub-match as result
puts "\nResult : --->$expect_out(1,string)"

这将使输出为

dinesh@dinesh-VirtualBox:~/stackoverflow$ ./alan 
spawn ssh dinesh@host
dinesh@host's password: 
Last login: Tue Apr 21 13:30:35 2015 
[dinesh@ ~]$ /home/dsivaji/mypgms/demo.sh
{\"INFO\":0}\0\r
{\"INFO\":0}\0\r
[dinesh@~]$ 
Result : --->{\"INFO\":0}\0\r
{\"INFO\":0}\0\r
[dinesh@~]
dinesh@dinesh-VirtualBox:~/stackoverflow$ 

注意结果为

{\"INFO\":0}\0\r
{\"INFO\":0}\0\r
[dinesh@~]

因为我们匹配到提示符$,所以它包含直到那个点。您也可以根据 shell 输出自定义正则表达式。

【讨论】:

  • 到目前为止是有道理的。我将测试看看 put 是否附加到 host-A 中的文件。会更新!
  • 添加了expect -re 并将$expect_out(0,string) 命令放入expect 脚本中并且工作正常!虽然需要修改您的解决方案,即保留 ssh $user@$hostname /path/script.sh 行,但将重定向置于预期之外。
【解决方案2】:

我假设您正在使用期望/设置方法,因为密码。

我发现安装了另一个名为 sshpass 的应用程序后,您可以在 bash 中运行这样的命令。

sshpass -p PASSWORDHERE ssh user@hostname /path/to/bash/script/script.sh | cat >> /tmp/file

http://linux.die.net/man/1/sshpass

享受

【讨论】:

  • 麦克斯,这真的很酷!是的,这就是我使用期望的原因。我正在看看是否可以通过 expect 方法让它工作,但 sshpass 是我一定会研究的。
猜你喜欢
  • 2015-05-12
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多