首页 > 解决方案 > 如何更改shell脚本中的目录?

问题描述

我编写了以下脚本来访问 SSH:

#!/usr/bin/expect -f

spawn ssh 123456 -p 2222
expect "password:"
send "foopassword\r"
interact

#!/usr/bin/expect -f现在只对我有用,因为我们也必须自动输入密码。

登录后稍后尝试做cd /xyz/directory,但这不起作用。

鉴于尝试引用相关帖子并将路径作为别名存储在 Bash 文件中,但仍然没有运气。

https://askubuntu.com/questions/481715/why-doesnt-cd-work-in-a-shell-script

如何在 ssh 登录后cd进行一些路径和操作ls以及内容?read是否可以从 Bash 脚本中执行?

标签: shellexpect

解决方案


通常,在您进行身份验证后,您会看到您的 shell 提示符。然后,您可以在使用“交互”收回控制权之前发送您想要的任何 shell 命令:

#!/usr/bin/expect -f

spawn ssh 123456 -p 2222
expect "password:"
send "foopassword\r"
expect -re {\$ $}        ;# shell prompt regex: prompt ends with "$" and space.

send "cd /foo/bar/baz\r"
expect -re {\$ $}

send "/bin/ls -1\r"
expect -re {/bin/ls -1\r\n(.*)\r\n.*\$ $}

set file_list $expect_out(1,string)
puts "found these files:\n$file_list"

interact

从 ssh 连接的数据流中提取命令输出是自动化 ssh 的痛苦部分之一。在这里,我们发送ls命令,但要捕获命令输出,我们需要一个复杂的正则表达式:

expect -re {/bin/ls -1\r\n(.*)\r\n.*\$ $}
# ..........\\    #1    //\\ #2 //\\#3//
  1. /bin/ls -1\r\n-- 匹配我们刚刚发送的命令,后跟 CRLF。
    • 由于终端会回显我们输入的命令,expect 会将其发回处理,我们必须处理它。
    • 期望总是发回\r\n换行符
  2. (.*)\r\n-- 匹配实际的命令输出,后跟提示符之前的换行符
    • .*将匹配命令输出中的“内部”换行符。这部分被捕获以供以后使用。
  3. .*\$ $-- 匹配提示。

如果您已自定义提示,则可能需要相应地调整模式。


推荐阅读