2

У меня удаленная машина с Ubuntu 16.04.3 работает. Я хочу, чтобы мой файл ~/.ssh/rc выполнялся каждый раз, когда я вхожу через ssh. Однако, это молча пропущено. Нет никаких сообщений об ошибках (или даже каких-либо связанных с rc сообщений) ни в ssh -vvvv со стороны клиента, ни в /var/log/auth.log со стороны сервера.

Параметр sshd PermitUserRC для sshd имеет значение Yes (это явно не упоминается в файле конфигурации, но его значение по умолчанию - Yes).

Разрешения 700 для ~/.ssh и ~/.ssh/rc .

Такая же настройка на стороне клиента работает в других версиях Ubuntu (12.04 и 14.04).

У меня есть доступ sudo к машине, но я не могу перезагрузить его или перезапустить sshd. (Хотя администраторы могут сделать это, если я найду причину).

Есть ли причины, по которым это может произойти?

1 ответ1

2

Это код 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. Файлы rc не запускаются, если была установлена опция sshd "UseLogin".
  2. .ssh/rc не вызывается, если сеанс вызывает подсистему. Это влияет на сеансы SFTP, например.
  3. .ssh/rc не вызывается, если сеанс подчиняется параметру ForceCommand в sshd_config (но не для принудительных команд от authorized_keys).
  4. .ssh/ гс не вызывается , если опция authorized_keys «не-пользователя-гс» была установлена (или "ограничения", который подразумевает не-пользователей-RC).
  5. .ssh/rc не вызывается, если для опции sshd_config "PermitUserRC" задано значение "no".
  6. .ssh/rc не вызывается, если он отсутствует, относительно домашнего каталога пользователя.

Если OpenSSH решит вызвать .ssh/rc, он в итоге вызовет эту команду:

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

где «$ SHELL» - это оболочка входа пользователя. Это не удастся, если оболочка пользователя не примет опцию «-c» для запуска команды. Также может произойти сбой, если /bin/sh отсутствует или работает неправильно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .