.ssh/rc 文件不执行的原因

Iva*_*nov 3 linux ssh ubuntu

我有一台运行 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。(尽管如果我找到原因,管理员可能会这样做)。

它可能发生的任何原因?

Ken*_*ter 6

这是用于调用.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)

所以,这告诉我们:

  1. 如果设置了 sshd 选项“UseLogin”,则不会调用 rc 文件。
  2. 如果会话正在调用子系统,则不会调用 .ssh/rc。例如,这会影响 SFTP 会话。
  3. 如果会话受 中的ForceCommand设置sshd_config(但不适用于来自 的强制命令authorized_keys),则不会调用 .ssh/rc 。
  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'
Run Code Online (Sandbox Code Playgroud)

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