Использовать autocd и CDPATH вместе в bash?

У Вас могли быть многочисленные пользователи и несколько портов, используемых даже для того же сервера. Самостоятельно, я соединяюсь с сотнями систем на интранет компании, большинство имеет многочисленных пользователей с различными функциями или серверами приложений. Доступ к Усера очень отличается от доступа к 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
4
21.07.2015, 11:52
1 ответ

Независимо от проекта или по надзору, кажется, что проверка того, набрали ли вы каталог 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: Нет такого файла или каталога .

3
27.01.2020, 20:57

Теги

Похожие вопросы