我有一台运行着 Ubuntu 16.04.3 的远程机器。我希望~/.ssh/rc
每次通过 ssh 登录时都执行我的文件。但是,它被默默地跳过了。无论是ssh -vvvv
客户端还是/var/log/auth.log
服务器端都没有错误消息(甚至没有任何与 rc 相关的消息)。
sshd 的sshd 选项PermitUserRC
设置为Yes
(配置文件中没有明确提及,但其默认值为Yes
)。
~/.ssh
和 的权限均为 700 ~/.ssh/rc
。
相同的客户端设置也适用于其他版本的 Ubuntu(12.04 和 14.04)。
我拥有机器的 sudo 访问权限,但无法重新启动它或重新启动 sshd。(但如果我找到原因,管理员可能会这样做)。
发生这种情况的原因是什么?
答案1
这是用于调用 的 OpenSSH 7.3p1 代码.ssh/rc
。它来自“session.c”。rc 文件由名为 的函数调用do_rc_files()
。所有这些代码都在服务器中运行。引用的所有选项均取自sshd_config
,以及authorized_keys
用于验证会话的密钥的文件条目(如果使用了密钥验证)。
/*
* Run $HOME/.ssh/rc, /etc/ssh/sshrc, or xauth (whichever is found
* first in this order).
*/
static void
do_rc_files(Session *s, const char *shell)
{
[...]
/* ignore _PATH_SSH_USER_RC for subsystems and admin forced commands */
if (!s->is_subsystem && options.adm_forced_command == NULL &&
!no_user_rc && options.permit_user_rc &&
stat(_PATH_SSH_USER_RC, &st) >= 0) {
snprintf(cmd, sizeof cmd, "%s -c '%s %s'",
shell, _PATH_BSHELL, _PATH_SSH_USER_RC);
if (debug_flag)
fprintf(stderr, "Running %s\n", cmd);
f = popen(cmd, "w");
if (f) {
if (do_xauth)
fprintf(f, "%s %s\n", s->auth_proto,
s->auth_data);
pclose(f);
} else
fprintf(stderr, "Could not run %s\n",
_PATH_SSH_USER_RC);
} else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
...
do_rc_files()
其本身被像这样调用:
if (!options.use_login)
do_rc_files(s, shell);
因此,这告诉我们:
- 如果设置了 sshd 选项“UseLogin”,则不会调用 rc 文件。
- 如果会话正在调用子系统,则不会调用 .ssh/rc。例如,这会影响 SFTP 会话。
- 如果会话受
ForceCommand
中的设置约束,则不会调用 .ssh/rcsshd_config
(但不适用于 的强制命令authorized_keys
)。 authorized_keys
如果设置了选项“no-user-rc”(或“restrict”,意味着 no-user-rc),则不会调用 .ssh/rc。sshd_config
如果选项“PermitUserRC”设置为“no”,则不会调用.ssh/rc。- 如果相对于用户的主目录不存在 .ssh/rc,则不会调用它。
如果 OpenSSH 决定调用 .ssh/rc,它最终将调用此命令:
$SHELL -c '/bin/sh .ssh/rc'
其中“$SHELL”是用户的登录 shell。如果用户的 shell 不接受“-c”选项来运行命令,则此操作将失败。如果/bin/sh
缺少或无法正常工作,它也可能失败。