Используйте переменную env для представления параметров SSH - PullRequest
1 голос
/ 09 июля 2019

Эти две опции ssh:

 ssh -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0

Меня интересует настройка тех, кто использует переменные env, есть ли способ сделать это?

export StrictHostKeyChecking=no 
export NumberOfPasswordPrompts=0

но это, конечно, не совсем верно

1 Ответ

2 голосов
/ 09 июля 2019

«Правильный» способ сделать это находится в вашем файле ~/.ssh/config, где вы можете сделать их глобальными для всех соединений или ограничить их хостом (или несколькими более сложными вещами).Я собираюсь предположить, что вы не можете этого сделать, но у вас все еще есть возможность изменить ~/.bashrc или что-то еще.

Вы можете решить это, вставив это в свои ~/.bashrc или * 1006.* (или запустив эти строки до ssh):

SSH_ARGS=( -o StrictHostKeyChecking=no -o NumberOfPasswordPrompts=0 )
alias ssh='ssh "${SSH_ARGS[@]}"'

Если вам нужны явные переменные окружения, такие как то, что вы предлагаете в своем вопросе (например, $StrictHostKeyChecking), тогда вам придется сделатьдействительно ужасный псевдоним или функция для преобразования их всех в финальный вызов ssh.Вот решение, которое должно работать в bash, но не будет работать в оболочке POSIX:

ssh() {
  local SSH_VAR SSH_VAR_VALUE
  for SSH_VAR in StrictHostKeyChecking NumberOfPasswordPrompts; do # expand this
    SSH_VAR_VALUE="${!SSH_VAR}" # bash indirect expansion
    if [ -n "$SSH_VAR_VALUE" ]; then
      set -- -o "$SSH_VAR=$SSH_VAR_VALUE" "$@"
    fi
  done
  command ssh "$@"
}

В приведенном выше примере поддерживаются только две переменные SSH, указанные в вопросе.Эта строка, скорее всего, должна быть очень длинной, поскольку она должна явно указывать каждую опцию перед точкой с запятой в строке с комментарием # expand this.

Это перебирает все поддерживаемые переменные SSH и использует косвенное расширение bash. чтобы проверить, есть ли оно в окружении (а не пустое значение).Если это так, -o и имя опции и ее значение добавляются перед началом списка аргументов ($@).

Если вы используете zsh, вам потребуется параметр zshфлаг расширения P, заменяющий bash ${!SSH_VAR} на zsh ${(P)SSH_VAR}.Другим оболочкам может потребоваться заменить всю эту строку «косвенного расширения bash» на eval "SSH_VAR_VALUE=\"\${$SSH_VAR}\"" (следите за тем, чтобы ваши цитаты там были, или эта строка может быть опасной).

Вызов command ssh предотвращает рекурсию, из которой мы получаемвызов ssh из функции с тем же именем.command ssh игнорирует функцию и фактически запускает команду true ssh.

...