如何更改 shell 脚本中的目录?

How to change directory in shell script?

我写了下面的脚本来访问 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

如何cd到某个路径并在ssh logging后做lsread内容?是否可以从 Bash 脚本执行?

如果你想列出一个目录的内容,你不需要先 cd 到该目录,只需要

ls xyz/directory

通常,在您进行身份验证后,您会看到 shell 提示。然后你可以发送任何你想要的 shell 命令,然后再用 "interact":

取回控制权
#!/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 -- 匹配实际命令输出,后跟提示符之前的换行符
    • .* 将匹配命令输出中的 "internal" 换行符。这部分被捕获以备后用。
  3. .*$ $ -- 匹配提示。

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