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