无法在 .ssh/rc 中使用“read”命令

无法在 .ssh/rc 中使用“read”命令

我想在 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。

相关内容