我的目标是自动化以下
这是可能的,还是我必须做所有事情?
答案 0 :(得分:1)
你遇到的问题是各个层面的沟通必须保持不变;还有比你意识到的更多。
你的模特是这样的:
+------+ expect +-----+ su +----------------+
| bash | ---------> | ssh | -----> | remote-context |
+------+ +-----+ +----------------+
但实际上发生了什么:
+----------------+ +----------------------+ +----------------------------+
| local terminal | | expect | | remote terminal |
| | | +------------------+ | | +------------------------+ |
| +------+ | | | virtual terminal | | | | bash | |
| | bash | -----> | | | | | | +--------------------+ | |
| +------+ | | | +-----+ | | | | | su | | |
| | | | | ssh | ---------> | | | +----------------+ | | |
+----------------+ | | +-----+ | | | | | | remote context | | | |
| +------------------+ | | | | +----------------+ | | |
+----------------------+ | | +--------------------+ | |
| +------------------------+ |
+----------------------------+
或类似的东西(例如,我省略了与网络有关的大部分内容)。有一个很多的分层正在进行,其中大多数是你不知道的。但是因为ssh
在expect
内运行(为了利用自动化功能),这意味着ssh
正在由expect
控制的本地虚拟终端中运行; bash
无法直接控制,expect
无法将自己从循环中切除(因为bash
不知道如何成为虚拟终端的主端; { {1}}和expect
知道这一点。
相反,您需要直接在expect中编写剩余的代码,或者提供可以作为参数运行的代码(在某种意义上,可能是从文件中提取的?),它可以通过{传递{1}}。
Expect从sshd
变量中获取参数,可以使用send
从其来电者处读取一行文字,argv
/ gets stdin
/ open
拉入文件的内容。
您是否知道read
替代close
?这可以配置为允许特定请求用户完全无密码操作。这对于允许系统操作而不暴露太大的安全漏洞是有用的。您还应该考虑切换到更适合自动化的sudo
形式,例如:
su
这种事情一旦发挥作用,就会以意想不到的方式减少错误......