首页 > 解决方案 > 在期望脚本之前和之后使用 bash 命令

问题描述

简而言之,我希望输入我的脚本的名称,这将提示用户输入 jumpbox 的主机名、登录名和密码,然后脚本将运行一系列命令,例如 ping 设备、scp 文件到其他主机等... 目前,我只是让脚本运行一个简单的 ls -lrt。

但是,当我运行脚本时,一切都可以正常登录,但是一旦我进入主机,脚本就会结束。我正在寻找登录后如何停止脚本,以便我可以从脚本运行新命令。

我在这里浏览了一系列页面,但我发现没有任何内容真正谈论这一点。

#!/bin/bash
echo -n "Logging in to server at HOSTNAME"
echo
echo -n "Hostname:"
read -s host
echo
echo -n "Username:"
read -s user
echo
echo -n "Password:"
read -s PWD
echo

/usr/bin/expect <<EOF
set timeout 1
spawn ssh $user@$host
expect "password:"
send "$PWD\n"
expect eof


ls -lrt

这是我得到的结果:

Logging in to server at
Username:
Password:
spawn ssh user@host
user@host's password:

-bash-4.1$ home/Desktop:~ userid$

home/Desktop:~ userid$ 是跳转框外返回到我的会话窗口的提示。

标签: bashexpect

解决方案


您的 for 语法expect似乎不正确。根据您的查询,您想将文件 scp 到远程主机,无论如何我可以帮助您使用语法:

/usr/bin/expect <<EOF
set timeout -1
spawn /usr/bin/sftp ${user_name}@${HOSTNAME}
expect "password:"
send "${passwd}\r"
expect "sftp>"
send "cd /the_path/to_put_files/\r"
expect "sftp>"
send "mput *\r"
expect "sftp>"
send "bye\r"
EOF

ls -lrt

set timeout -1== 用于将 n 个文件发送到远程服务器而没有超时限制。

希望这可以帮助。


推荐阅读