在远程服务器上执行本地 bash 脚本但需要用户输入

在远程服务器上执行本地 bash 脚本但需要用户输入

我正在使用 SSH 命令远​​程执行 bash 脚本:

ssh user@server 'bash -s' < $script_dir/script.sh

在 script.sh 中,我将使用如下命令来添加 ssh 密钥:

ssh-keygen -t rsa
ssh-copy-id postgres@$sqlserver
ssh postgres@$sqlserver -C true

并在远程 SQL 服务器中创建用户

printf "Creating user in postgresql server...\n"
createuser -s -P username

它需要用户的输入,但是我发现当我从远程服务器执行命令时,它会跳过获取用户的输入并失败。

另外一个是:

printf "Please enter your barman server name: \n" ; read -s barmanserver

也无法读取用户的输入

我知道该脚本似乎无法读取其他终端的输入,但如果我需要用户输入才能继续,有人可以帮我找到解决方案吗?

多谢!!

伊娃

答案1

您用于远程脚本执行的方法将生成冲突代码和数据流之间。我的意思是... 在执行期间ssh user@server 'bash -s' < $script_dir/script.sh,您为将要远程执行的代码分配标准输入 (STDIN)。但如果执行的代码需要数据输入,它将由下一行代码提供(因为 STDIN 正在将代码行传送到远程进程bash)。

如果您想使用 STDIN 为远程运行的脚本提供输入数据,则可能必须使用另一个流来处理代码。OpenSSH 似乎还没有原生文件描述符转发功能,也就是说,STDIN(文件描述符编号 0)似乎是唯一可用于从本地终端向远程会话转发数据的文件描述符。作为一种解决方法,您可以提前复制脚本文件,例如:

scp $script_dir/script.sh user@server:/home/user/$script_dir/script.sh && \
ssh user@server /home/user/$script_dir/script.sh

或者,您可以使用 Bash hacking 来避免将本地代码写入远程文件系统。例如:

cat $script_dir/script.sh - | ssh user@server \
bash \<\( head -c `wc -c < $script_dir/script.sh` \)

PS:上述黑客攻击并非最佳,因为:

  • 如果 SSH 请求用户密码或密钥密码等身份验证数据,则它不起作用;

  • 本地会话在远程执行结束后需要额外的输入行。

答案2

Expect 脚本用于自动提供输入,您可以将该脚本用于您的场景,提到的链接提供了更多详细信息: https://www.thegeekstuff.com/2010/10/expect-examples/

答案3

来自手册页远程控制

-t' 强制分配伪 tty。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。

ssh -t user@server 'bash -s' < $script_dir/script.sh

相关内容