如何更改 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后做ls
和read
内容?是否可以从 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//
/bin/ls -1\r\n
-- 匹配我们刚刚发送的命令,后跟 CRLF。
- 由于终端会回显我们输入的命令,expect会发回处理,我们不得不处理。
- 期望总是发回
\r\n
换行符
(.*)\r\n
-- 匹配实际命令输出,后跟提示符之前的换行符
.*
将匹配命令输出中的 "internal" 换行符。这部分被捕获以备后用。
.*$ $
-- 匹配提示。
如果您自定义了提示,您可能需要相应地调整模式。
我写了下面的脚本来访问 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后做ls
和read
内容?是否可以从 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//
/bin/ls -1\r\n
-- 匹配我们刚刚发送的命令,后跟 CRLF。- 由于终端会回显我们输入的命令,expect会发回处理,我们不得不处理。
- 期望总是发回
\r\n
换行符
(.*)\r\n
-- 匹配实际命令输出,后跟提示符之前的换行符.*
将匹配命令输出中的 "internal" 换行符。这部分被捕获以备后用。
.*$ $
-- 匹配提示。
如果您自定义了提示,您可能需要相应地调整模式。