shell - 如何更改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 脚本中执行?
解决方案
通常,在您进行身份验证后,您会看到您的 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。- 由于终端会回显我们输入的命令,expect 会将其发回处理,我们必须处理它。
- 期望总是发回
\r\n
换行符
(.*)\r\n
-- 匹配实际的命令输出,后跟提示符之前的换行符.*
将匹配命令输出中的“内部”换行符。这部分被捕获以供以后使用。
.*\$ $
-- 匹配提示。
如果您已自定义提示,则可能需要相应地调整模式。
推荐阅读
- python - 如何在 matplotlib 中使用 Humor Sans?
- python - 3D 点云图
- javascript - Socket.io 向所有客户端发出消息,但最初发出原始消息的客户端除外
- c# - 比较 ReadOnlyMemory 的最佳方法
实例? - python - 如何获取列值与另一列值比较的索引值
- c# - 控制台应用程序进度条很慢
- python-3.x - 反转图像错误
- python-3.x - 在 Keras 中添加 SimpleRNN 或 LSTM 层的问题
- java - 如何将 jar 文件移动到 StartUp 文件夹 - Java
- android - 从列表中取消选中项目后,我的应用程序正在关闭