如何在Shell脚本中更改目录?

时间:2018-08-01 08:16:41

标签: shell expect

我写了以下脚本来访问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到某个路径以及lsread的内容?可以从Bash脚本执行吗?

2 个答案:

答案 0 :(得分:1)

通常,在您进行身份验证之后,您将期望看到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相匹配。
    • 由于终端回显了我们键入的命令,因此期望将其发回进行处理,因此我们必须对其进行处理。
    • 期望总是发回\r\n以获取换行符
  2. (.*)\r\n-匹配实际的命令输出,并在提示符之前换行
    • .*将在命令输出中匹配“内部”换行符。该部分已捕获,供以后使用。
  3. .*\$ $-匹配提示。

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

答案 1 :(得分:0)

如果要列出目录的内容,则无需先将CD cd到该目录,只需

ls xyz /目录