SSH 命令在 expect 脚本中表现不同
SSH command behaving differently in expect script
我正在创建一个脚本,该脚本从主机 A 执行以连接到远程主机 b,运行s 主机上的 bash 脚本(从 top 等生成监控数据) -b,并将输出追加回主机 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 脚本的输出附加到主机 B /tmp/file 而不是所需的主机 A /tmp/file。我怎样才能将脚本附加到主机 A 而不是主机 b?
P.S.
- 手动登录主机 A
- cd 到脚本位置
- 运行 ssh 用户@主机名 /path/to/script/script.sh | cat >> /tmp/file 在主机 A
上
- 猫/tmp/file
以上手动步骤按要求执行;因此我认为问题出在 expect.bash 中。
欢迎任何想法!
此致,
艾伦
我假设您使用 expect/set 方法是因为密码。
安装后我发现了另一个名为 sshpass 的应用程序,您只需 运行 在您的 bash 中使用这样的命令即可。
sshpass -p PASSWORDHERE ssh user@hostname /path/to/bash/script/script.sh | cat >> /tmp/file
http://linux.die.net/man/1/sshpass
享受
如果您只想获取该脚本的输出,请按照以下方式继续。
#!/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:~/Whosebug$ ./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}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]$
Result : --->{\"INFO\":0}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]
dinesh@dinesh-VirtualBox:~/Whosebug$
请注意,结果为
{\"INFO\":0}[=12=]\r
{\"INFO\":0}[=12=]\r
[dinesh@~]
因为我们匹配到提示 $
,它包含到那个点。您还可以根据 shell 输出自定义正则表达式。
我正在创建一个脚本,该脚本从主机 A 执行以连接到远程主机 b,运行s 主机上的 bash 脚本(从 top 等生成监控数据) -b,并将输出追加回主机 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 脚本的输出附加到主机 B /tmp/file 而不是所需的主机 A /tmp/file。我怎样才能将脚本附加到主机 A 而不是主机 b?
P.S.
- 手动登录主机 A
- cd 到脚本位置
- 运行 ssh 用户@主机名 /path/to/script/script.sh | cat >> /tmp/file 在主机 A 上
- 猫/tmp/file
以上手动步骤按要求执行;因此我认为问题出在 expect.bash 中。
欢迎任何想法!
此致,
艾伦
我假设您使用 expect/set 方法是因为密码。
安装后我发现了另一个名为 sshpass 的应用程序,您只需 运行 在您的 bash 中使用这样的命令即可。
sshpass -p PASSWORDHERE ssh user@hostname /path/to/bash/script/script.sh | cat >> /tmp/file
http://linux.die.net/man/1/sshpass
享受
如果您只想获取该脚本的输出,请按照以下方式继续。
#!/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:~/Whosebug$ ./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}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]$
Result : --->{\"INFO\":0}[=11=]\r
{\"INFO\":0}[=11=]\r
[dinesh@~]
dinesh@dinesh-VirtualBox:~/Whosebug$
请注意,结果为
{\"INFO\":0}[=12=]\r
{\"INFO\":0}[=12=]\r
[dinesh@~]
因为我们匹配到提示 $
,它包含到那个点。您还可以根据 shell 输出自定义正则表达式。