.ssh/rc文件无法执行的原因

.ssh/rc文件无法执行的原因

我有一台运行着 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);

因此,这告诉我们:

  1. 如果设置了 sshd 选项“UseLogin”,则不会调用 rc 文件。
  2. 如果会话正在调用子系统,则不会调用 .ssh/rc。例如,这会影响 SFTP 会话。
  3. 如果会话受ForceCommand中的设置约束,则不会调用 .ssh/rc sshd_config(但不适用于 的强制命令authorized_keys)。
  4. authorized_keys如果设置了选项“no-user-rc”(或“restrict”,意味着 no-user-rc),则不会调用 .ssh/rc。
  5. sshd_config如果选项“PermitUserRC”设置为“no”,则不会调用.ssh/rc。
  6. 如果相对于用户的主目录不存在 .ssh/rc,则不会调用它。

如果 OpenSSH 决定调用 .ssh/rc,它最终将调用此命令:

$SHELL -c '/bin/sh .ssh/rc'

其中“$SHELL”是用户的登录 shell。如果用户的 shell 不接受“-c”选项来运行命令,则此操作将失败。如果/bin/sh缺少或无法正常工作,它也可能失败。

相关内容