gpt4 book ai didi

Linux 期望在使用交互后不将控制权返回给 bash 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:45 24 4
gpt4 key购买 nike

我的目标是自动化以下内容

  • 从主 shell 脚本登录到远程 SSH session (无密码 key 已经设置)
  • 然后我需要 root 访问权限,所以我使用 expect 登录,即发送“su”,期待“密码:”,发送“”,这有效。
  • 然后我想将控制权从 expect 释放回调用 expect 脚本的 bash 脚本,并以 root 身份登录运行各种 SSH 命令。

这是可能的还是我必须通过 expect 做所有事情?

最佳答案

您遇到的问题是,各个层次的通信必须保持原样;发生的事情比您意识到的要多。

你的模型是这样的:

+------+   expect   +-----+   su   +----------------+
| bash | ---------> | ssh | -----> | remote-context |
+------+ +-----+ +----------------+

但实际情况是这样的:

+----------------+   +----------------------+   +----------------------------+
| local terminal | | expect | | remote terminal |
| | | +------------------+ | | +------------------------+ |
| +------+ | | | virtual terminal | | | | bash | |
| | bash | -----> | | | | | | +--------------------+ | |
| +------+ | | | +-----+ | | | | | su | | |
| | | | | ssh | ---------> | | | +----------------+ | | |
+----------------+ | | +-----+ | | | | | | remote context | | | |
| +------------------+ | | | | +----------------+ | | |
+----------------------+ | | +--------------------+ | |
| +------------------------+ |
+----------------------------+

或类似的东西(例如,我省略了大部分与网络有关的部分)。有很多分层正在进行,其中大部分您都没有意识到。但是因为 sshexpect 中运行(为了利用自动化功能)这意味着 ssh 在本地虚拟终端中运行由 expect 控制; bash 无法直接控制,expect 也无法将自己跳出循环(因为 bash 不知道如何虚拟终端的主端;expectsshd do 知道)。

相反,您需要直接在 expect 中编写剩余的代码,或者提供要作为参数运行的代码(在某种意义上;可能是从文件中提取的?),它可以通过 发送

Expect 从 argv 变量中获取参数,可以使用 gets stdin 从调用者那里读取一行文本,并且 open/read/close 以提取文件的内容。


您是否知道 sudo 可以替代 su?可以将其配置为允许特定请求用户完全免密码操作。这对于允许在不暴露太大安全漏洞的情况下运行系统很有用。您还应该考虑切换到一种更适合自动化的 ssh 形式,例如:

spawn ssh $remotehost sudo /usr/local/bin/DoTheWonderfulThing

这种东西,一旦它起作用,就会有更少的部分以意想不到的方式出错......

关于Linux 期望在使用交互后不将控制权返回给 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com