我正在使用 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