我写了以下脚本来访问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脚本执行吗?
答案 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//
/bin/ls -1\r\n
-与我们刚发送的命令以及CRLF相匹配。
\r\n
以获取换行符(.*)\r\n
-匹配实际的命令输出,并在提示符之前换行
.*
将在命令输出中匹配“内部”换行符。该部分已捕获,供以后使用。.*\$ $
-匹配提示。如果您已自定义提示,则可能需要相应地调整模式。
答案 1 :(得分:0)
如果要列出目录的内容,则无需先将CD cd到该目录,只需
ls xyz /目录