我想在 SSH 连接建立后从键盘读取输入。因此我编辑了.ssh/rc
文件并使用read
命令,就像:
#!/bin/sh
read -p "input: " something
echo $something
但输出是空白的;该read
命令不起作用。
但是,如果放在.bashrc
文件中,这通常可以工作。我如何read
在文件中使用命令.ssh/rc
?
答案1
man 8 sshd
在我的 Debian 中读到 [强调我的]:
If ~/.ssh/rc
存在并且sshd_config(5)
PermitUserRC
选项设置了,则运行它;否则,如果/etc/ssh/sshrc
存在,则运行它;否则运行xauth
。“rc” 文件在标准输入中被赋予 X11 身份验证协议和 cookie。[…]
如果文件
~/.ssh/rc
存在,sh(1)
则在读取环境文件之后但在启动用户的 shell 或命令之前运行它。它不得在 stdout 上产生任何输出;必须改用 stderr。如果正在使用 X11 转发,它将在其标准输入(及其DISPLAY
环境中)中接收“proto cookie”对。脚本必须调用xauth(1)
becausesshd
不会xauth
自动运行以添加 X11 cookies。
即使未使用 X11 转发,您read
也不会与您键入的内容进行交互,因为 stdin 是从其他地方获取的。(请注意,此外echo
还会打印到 stdout,但实际上不应该)。
如果您请求 X11 转发(并且所有设置都正确,可以正常工作),您read
确实会读取一些内容并echo
打印一些内容。尝试一下 ( ssh -X the_server
)。示例输出:
MIT-MAGIC-COOKIE-1 d936faac03ac21db21160fb6cab5be86
如果你添加ls -l /proc/$$/fd/
到脚本中,它会显示文件描述符0
(stdin) 不是你所期望的。例如:
lr-x------ 1 kamil kamil 64 May 5 12:03 0 -> pipe:[5335679]
lrwx------ 1 kamil kamil 64 May 5 12:03 1 -> /dev/pts/4
lrwx------ 1 kamil kamil 64 May 5 12:03 2 -> /dev/pts/4
lr-x------ 1 kamil kamil 64 May 5 12:03 3 -> /proc/13928/fd
如果你不知道:0
是 stdin,1
是 stdout,2
是 stderr。
您可以read
与 TTY 进行交互:
</dev/tty read -p "input: " something
echo "$something" >&2
笔记:
- 您使用的 shebang 无关紧要,无论如何都
sshd
用于sh
运行文件。 - 一般来说,你应该用双引号括住变量。
- 我的代码按照手册的要求打印到 stderr。
- 该脚本没有运行
xauth
,因此您将无法转发 X11。