我有一台运行 Ubuntu 16.04.3 的远程机器。我希望~/.ssh/rc
每次通过 ssh 登录时都执行我的文件。然而,它被悄悄地跳过了。ssh -vvvv
客户端和/var/log/auth.log
服务器端都没有错误消息(甚至任何与 rc 相关的消息)。
sshd 的 sshd 选项PermitUserRC
设置为Yes
(在配置文件中没有明确提及,但其默认值为Yes
)。
权限是700两~/.ssh
和~/.ssh/rc
。
相同的客户端设置适用于其他版本的 Ubuntu(12.04 和 14.04)。
我有对机器的 sudo 访问权限,但无法重新启动它或重新启动 sshd。(尽管如果我找到原因,管理员可能会这样做)。
它可能发生的任何原因?
这是用于调用.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) {
...
Run Code Online (Sandbox Code Playgroud)
do_rc_files()
本身是这样调用的:
if (!options.use_login)
do_rc_files(s, shell);
Run Code Online (Sandbox Code Playgroud)
所以,这告诉我们:
ForceCommand
设置sshd_config
(但不适用于来自 的强制命令authorized_keys
),则不会调用 .ssh/rc 。authorized_keys
选项“no-user-rc”(或“restrict”,这意味着 no-user-rc),则不会调用 .ssh/rc 。sshd_config
选项“PermitUserRC”选项设置为“no”,则不会调用 .ssh/rc 。如果 OpenSSH 决定调用 .ssh/rc,它将最终调用以下命令:
$SHELL -c '/bin/sh .ssh/rc'
Run Code Online (Sandbox Code Playgroud)
其中“$SHELL”是用户的登录shell。如果用户的 shell 不接受“-c”选项来运行命令,这将失败。如果/bin/sh
丢失或无法正常工作,它也可能失败。