«Правильный» способ сделать это находится в вашем файле ~/.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
.