SSH命令在expect脚本中表现不同

时间:2015-04-20 22:27:27

标签: linux bash shell ssh expect

我正在创建一个从主机-A执行以连接到远程主机-b的脚本,在host-b上运行bash脚本(从顶部等生成监控数据),并将输出追加到a主机-A上的文件。虽然我使用ssh进行连接,但我不会使用ssh-key,因为环境中的服务器太多了。

我期待的剧本:

"#!/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。如何更改为将脚本附加到host-A而不是host-b?

P.S。

  1. 手动登录host-A
  2. cd to script location
  3. 运行ssh user @ hostname /path/to/script/script.sh |猫>>主机-A上的/ tmp /文件
  4. cat / tmp / file
  5. 以上手动步骤按要求执行;因此我认为问题在于期待bash。

    感谢任何想法!

    此致

    艾伦

2 个答案:

答案 0 :(得分:0)

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

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

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

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

享受

答案 1 :(得分:0)

如果您的目的是获取该脚本的输出,请按以下方式继续。

#!/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输出自定义正则表达式。