У Вас могли быть многочисленные пользователи и несколько портов, используемых даже для того же сервера. Самостоятельно, я соединяюсь с сотнями систем на интранет компании, большинство имеет многочисленных пользователей с различными функциями или серверами приложений. Доступ к Усера очень отличается от доступа к userB, и основное соединение должно было бы отличаться. Более кратко, если необходимо было работать:
$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA
Как Вы видите, мы не получаем сессию OpenSSH с userB, но оригинал с Усера. Это означает, что корневой каталог, полномочия и даже сама аутентификация не то, что ожидается. Используя это, если необходимо было попытаться удалить файл в каталоге userB, затем a) это мог быть неправильный файл и b) это могли быть неправильные полномочия.
Если Вы никогда не будете соединяться с больше, чем отдельный пользователь ни на каком сервере с помощью единственного порта, то да, с помощью %h
мог быть достаточно. В Вашем ~/.ssh/config
файл, Вы хотели бы использовать:
ControlMaster=auto # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes
С ControlPersist
опция, основное соединение остается открытым в фоновом режиме, пока не уничтожено или завершено с ssh -O exit
. Это - хорошая set-it-and-forget-it функция.
Но если бы существует возможность соединения больше чем с одним пользователем на каком-либо хосте, то Вы хотели бы что-то более безопасное:
ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Независимо от проекта или по надзору, кажется, что проверка того, набрали ли вы каталог name не выполняет поиск в переменной CDPATH
:
execute.cmd.c
, function execute_simple_command
:
if (autocd && interactive && words->word && is_dirname (words->word->word))
{
words = make_word_list (make_word ("cd"), words);
xtrace_print_word_list (words, 0);
goto run_builtin;
}
Определение is_dirname
находится в том же исходном файле:
/* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
to PATHNAME, is a directory. Used by the autocd code below. */
static int
is_dirname (pathname)
char *pathname;
{
char *temp;
int ret;
temp = search_for_command (pathname, 0);
ret = (temp ? file_isdir (temp) : file_isdir (pathname));
free (temp);
return ret;
}
Из этого следует, что autocd
найдет каталоги на PATH
, но я тестировал его с X11
] (для / usr / bin / X11 /
) и получил ошибку X11: Нет такого файла или каталога
.