Как я могу автоматически изменить каталог при входе в систему через ssh?

Я пытаюсь получить ssh для автоматического перехода в определенный каталог при входе в систему. Я попытался заставить это поведение работать, используя следующие директивы в ~/.ssh/config:

Host example.net
LocalCommand "cd web"

но всякий раз, когда я вхожу, я вижу следующее:

/bin/bash: cd web: No such file or directory

хотя, хотя, безусловно, есть web папка в моем домашнем каталоге. Даже использование абсолютного пути дает одно и то же сообщение. Чтобы было понятно, если я наберу cd web после входа в систему я попадаю в нужную папку.

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ:

Различные комбинации кавычек / абсолютных путей дают разные сообщения об ошибках:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Это заставляет меня думать, что кавычек не должно быть, и что происходит другая ошибка.

12 ответов

Решение

CD - это встроенная оболочка. LocalCommand выполняется как:

/bin/sh -c <localcommand>

То, что вы хотите сделать, на самом деле не может быть достигнуто через SSH; вам нужно каким-то образом изменить оболочку, например, через bashrc/bash_profile.

Это работает:

ssh server -t "cd /my/remote/directory; bash --login"

Чтобы создать каталог, если он не существует:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

Если вы не добавите bash до конца пути, затем вы выходите после cd команда работает. И если вы не добавите --login тогда ваш ~/.profile не получены.

  1. Войдите в вашу коробку
  2. редактировать ~/.bash_profile
  3. В конце файла добавьте cd /path/to/your/destination
  4. Сохранить и выйти
  5. Выйти из коробки
  6. Войдите снова и вы должны приземлиться на /path/to/your/destination

Более надежное решение для случая, когда вам нужно ssh и переопределить файл.bashrc по умолчанию. Это полезно в тех случаях, когда среда удаленного сервера имеет несколько корневых узлов и используется несколькими пользователями.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Более подробный:

  1. Первая команда создает .bashrc_tmp файл в /tmp каталог на удаленном сервере с контентом cd /path/to/dir
  2. Следующая команда выполняется bash с файлом конфигурации, указанным в шаге 1. Это позволяет переключиться на нужный каталог и подавить значение по умолчанию .bashrc,
  3. Вся эта команда обернута как alias, поэтому в командной строке клиента ssh он может называться ssh_myserver

Вы включили эту директиву в вашей конфигурации SSH?

PermitLocalCommand yes

По умолчанию это noв этом случае ваш LocalCommand директива будет проигнорирована.

Кроме того, вы пытались добавить команду в свой .bashrc файл?

Таким образом, я искал много сайтов (stackoverflow, этот), но не нашел то, что хотел. Я закончил тем, что создал свой собственный скрипт оболочки. Я вставляю это здесь. Также вы можете скопировать его в каталог в $PATH.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Итак, после этого. Я делаю:

connect <foldername>

Примечание. Может потребоваться выйти из системы и войти снова после изменения переменной пути

В вашем ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

В конце вашего ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

Я пытался сделать это с помощью передачи переменных, в том числе с экспортированной переменной, но эти команды выполняются в разных оболочках.

При тестировании того, что вы пытались сделать, я не получил ошибку, когда, между прочим, использовал абсолютный путь без кавычек. я добавил ; pwd в конце команды отображается правильный каталог, однако каталог, в котором я оказался, ~, Нет cd команды в моих файлах запуска оболочки. Я пытался положить другой cd somedir; pwd в ~/.ssh/rc (с другим все еще на месте). config Команда выполняется до того, как MOTD выпущен и rc Команда запускается позже, но до того, как файлы запуска оболочки получены. Опять же, это происходит в другой оболочке.

Попробуйте метод передачи по файлу и дайте мне знать, работает ли он для вас.

Вы пробовали это без кавычек вокруг этого? Единственные примеры, которые я видел, не имеют их, поэтому они могут пытаться выполнить cd\ web как команду.

Вы также можете попробовать это, с опцией -t:

ssh server -t "cd /my/remote/directory; bash"

Попробуйте использовать RemoteCommand вместо этого, например

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: Указывает команду для выполнения на удаленном компьютере после успешного подключения к серверу. (man ssh_config)

Я использую следующее в.ssh/config:

        RemoteCommand cd ~/mydir;bash
  RequestTTY force

Может тебе нужно создать ~/.bash_profile хотя у вас уже есть ~/.bashrc.

На моем debian система ~/.bashrc не был выполнен при входе в систему с sshpass.

Поскольку я добавил cd directory к вновь созданным ~/.bash_profile он работал нормально.

Другие вопросы по тегам