【问题标题】:bash script pass enter [return] key to another script initiated through ssh heredocbash 脚本将输入 [return] 键传递给通过 ssh heredoc 启动的另一个脚本
【发布时间】:2017-01-24 19:32:21
【问题描述】:

我在创建脚本时遇到了问题。它将一些数据复制到另一台服务器,然后使用 ssh heredoc 连接到服务器,它会启动位于 heredoc 内第二台服务器上的第二个脚本。

我遇到的问题是,如果您通过 bash 脚本执行第二个脚本(而不是手动启动它),那么它将跳过一个关键步骤,第二个脚本要求您点击 [enter] 然后输入密码以生成一些文件。

enter

password

我无权访问第二个脚本,因此无法更改任何内容。我尝试了所有类型的回声 | ./script2.sh 组合、printf、heredoc,没有任何效果。编辑:expect 在第二台服务器上不可用。

我正在做的例子:

scp -r $dir xxxx@xxx.xx.x.xx:/as/df/qwerty/

ssh xxxx@xxx.xx.x.xx "bash -s" << EOF
# install
/as/df/qwerty/${choice}/./install_${choice}
EOF

【问题讨论】:

  • 听起来第二个脚本需要一个终端。也许您可以使用“expect”程序来解决这个问题,该程序是为编写交互式应用程序而创建的。
  • 我希望我可以使用 expect,但第二台服务器没有它,我也无权在该服务器上安装它
  • 如果你有足够的权限通过你选择的解释器运行它,你就有足够的权限来修改它的运行方式——你可能只需要一点点...... 创意。例如,如果它正在运行 [ -t 0 ] 以检查 stdin 是否为 TTY,您可以将脚本输入到覆盖 [ 的 shell 中,以便在 $1-t$2 是 @987654329 时执行您自己的逻辑@.
  • @CharlesDuffy 您如何建议我将 [enter] 击键发送到在 ssh heredoc 中启动的第二个脚本?您的回复对我来说似乎是一门外语,因为我是 bash 新手,抱歉。
  • 基本上,我不建议你这样做。我建议您阅读第二个脚本的源代码,弄清楚它在当前尝试从 TTY 读取的位置周围做了什么,并欺骗该逻辑做一些更有意义的事情(例如,甚至无条件地从标准输入读取在非 TTY 的情况下)。这个脚本是公开的,所以我可以查看它并提供更具体的建议吗?

标签: bash shell ssh


【解决方案1】:

问题在于bash -s,shell 正在从标准输入读取命令,而远程脚本也在从标准输入读取。

您可以让远程 bash source 从 heredoc 动态生成脚本,而不是将脚本作为标准输入传递给 shell,例如:

ssh foo@bar "bash -c 'source <(cat <<EOF
/invoke/your/script.sh
EOF
)'"

【讨论】:

  • 我没有尝试将任何脚本传递到第二台服务器,而是将目录复制到第二台服务器,然后通过 ssh 进入第二台服务器以启动另一个脚本来构建一些文件。问题是第二个脚本要求用户按回车键,然后输入密码以完成安装。我似乎无法编写 [enter] 击键然后输入密码的脚本。通过第一个脚本调用第二个脚本将完全跳过该步骤。抱歉,如果我解释得不好,我是 bash 的新手
  • 您实际上并没有避免在那里引用问题。如果您的脚本使用 $'' 风格的引用,那么在单引号内将不起作用,因为您正在尝试传递所有内容。此外,脚本内的任何单引号都会关闭您在其外部注入的单引号。
  • 如果你想引用一个脚本以被远程 shell 安全解释,而不是用 ''s 包裹它(如前所述,实际上不起作用 i> 在一般情况下),使用printf '%q' 生成eval-安全版本。虽然这有其自身的缺陷,但如果远程系统上的 /bin/sh 不支持您的 shell 的 %q 所做的转义形式,这就是为什么 bash -s 并在标准输入上提供脚本实际上是首选方法一种场景。
  • @CharlesDuffy 你对单引号是完全正确的,我会从我的回答中删除这是一个很好的引号保留机制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 2022-12-08
  • 2020-11-02
  • 1970-01-01
相关资源
最近更新 更多