Я пытаюсь получить 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
не получен.
~/.bash_profile
cd /path/to/your/destination
/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"'
Более подробный:
.bashrc_tmp
файл в /tmp
каталог на удаленном сервере с содержимым cd /path/to/dir
bash
с конфигурационным файлом, указанным на шаге 1. Это позволяет переключиться на желаемый каталог и подавить значение по умолчанию .bashrc
.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
)