ssh 远程命令未按预期工作(读取问题)
ssh remote command not working as expected (problems with read)
我的服务器上有一个名为 test.sh
:
的脚本
#!/bin/bash
read -p "Select an option [1-4]: " option
echo "You have selected $option"
当我通过 ssh 手动 运行 它时,我看到了这个:
me@me:~$ ssh root@server
root@server's password:
[...]
root@server:~# bash test.sh
Select an option [1-4]: 48
You have selected 48
当我 运行 它作为 ssh 远程命令时,我看到了这个:
me@me:~$ ssh root@server 'bash test.sh'
root@server's password:
48
You have selected 48
我对这个输出不满意,因为它缺少 Select an option [1-4]:
提示字符串,而我从中导出的原始脚本 test.sh
包含很多这样的交互式对话字符串,我需要它们。
我知道 read
将提示打印到 stderr
所以我尝试使用以下命令启动脚本以防万一 stderr 被省略,但输出仍然相同:
ssh root@server 'bash test.sh >&2'
ssh root@server 'bash test.sh' >&2
ssh root@server 'bash test.sh 2>&1'
ssh root@server 'bash test.sh' 2>&1
为什么会发生这种情况以及如何使 ssh 远程命令按预期工作?
UPD
我已将 test.sh
更改为:
#!/bin/bash
echo Connected
read -p "Select an option [1-4]: " option
echo "You have selected $option"
但输出仍然缺少提示字符串:
me@me:~$ ssh root@server 'bash test.sh'
root@server's password:
Connected
66
You have selected 66
您需要在 ssh
中使用 -t
选项将伪终端分配给 ssh
会话:
ssh -q -t root@server 'bash test.sh'
我的服务器上有一个名为 test.sh
:
#!/bin/bash
read -p "Select an option [1-4]: " option
echo "You have selected $option"
当我通过 ssh 手动 运行 它时,我看到了这个:
me@me:~$ ssh root@server
root@server's password:
[...]
root@server:~# bash test.sh
Select an option [1-4]: 48
You have selected 48
当我 运行 它作为 ssh 远程命令时,我看到了这个:
me@me:~$ ssh root@server 'bash test.sh'
root@server's password:
48
You have selected 48
我对这个输出不满意,因为它缺少 Select an option [1-4]:
提示字符串,而我从中导出的原始脚本 test.sh
包含很多这样的交互式对话字符串,我需要它们。
我知道 read
将提示打印到 stderr
所以我尝试使用以下命令启动脚本以防万一 stderr 被省略,但输出仍然相同:
ssh root@server 'bash test.sh >&2'
ssh root@server 'bash test.sh' >&2
ssh root@server 'bash test.sh 2>&1'
ssh root@server 'bash test.sh' 2>&1
为什么会发生这种情况以及如何使 ssh 远程命令按预期工作?
UPD
我已将 test.sh
更改为:
#!/bin/bash
echo Connected
read -p "Select an option [1-4]: " option
echo "You have selected $option"
但输出仍然缺少提示字符串:
me@me:~$ ssh root@server 'bash test.sh'
root@server's password:
Connected
66
You have selected 66
您需要在 ssh
中使用 -t
选项将伪终端分配给 ssh
会话:
ssh -q -t root@server 'bash test.sh'