Назад | Перейти на главную страницу

Как я могу автоматически менять каталог при входе в 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

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

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

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

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

/bin/sh -c <localcommand>

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

<Монтаж почти десять лет спустя ...>

LocalCommand в любом случае это не то, что вам нужно. Это работает ваш машина. Вы хотите RemoteCommand. У меня сработало что-то вроде этого:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

Более надежное решение для случая, когда вам нужно использовать 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

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

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

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

connect <foldername>

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

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

PermitLocalCommand yes

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

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

В твоем ~/.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)