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

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


74
2017-08-05 14:40


Источник


LocalCommand запускается на вашей локальной системе, а не на удаленной системе. - Steve Kehlet
Глянь сюда superuser.com/a/124110/47962 - Nakilon


Ответы:


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

/bin/sh -c <localcommand>

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


18
2017-08-05 15:52



Да, просто хотел упомянуть об этом. Вы можете cd команду в ~/.bashrc на удаленном сервере. - vdboor
Это раздражает. Как я уже упоминал в другом комментарии, сервер имеет несколько имен хостов, и я хотел иметь другое поведение, основанное на том, что было использовано. Наверное, невозможно определить, что было использовано из .bashrc? - Gareth
Это возможно, возможно, не рекомендуется. Что-то вроде замены ssh на небольшой скрипт оболочки или псевдоним, который передает имя хоста в качестве экспортируемой переменной (a la «ssh -t user @ host» export connhostname = host; bash --login '»). Но вы начинаете входить в очень странную территорию. Возможно, лучший вопрос: ПОЧЕМУ вы хотите этого поведения? - BMDan
Честно говоря, это не такая уж большая сделка. Я просто в ситуации, когда большую часть времени я заходил на этот сервер, я направляюсь прямо в одну из двух каталогов (в зависимости от того, какой хост я использую) - Gareth


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

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

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

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

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


74
2017-12-21 21:29



Это заканчивает меня в правильном месте, с подсказкой bash. идеально! - Peter Ehrlich
Это работает и для меня, но если я попытаюсь использовать его с ssh jump-host, это не сработает. Я получаю сообщение закрытого соединения. - Riccardo


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

38
2018-02-27 11:04



На некоторых машинах вам может потребоваться добавить cd /path/to/your/destination в ~/.bashrc а не ~/.bash_profile, Результат должен быть таким же. - Matthias
Это прекрасно работает - ограничивается ли это только моим идентификатором пользователя или будет ли он влиять на другие пользовательские логины? - barry_allen
@BabyGroot, если вы изменяете ~/.bash_profile или ~/.bashrc это повлияет только на текущего пользователя. - rubenvarela


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

5
2017-08-21 11:53



Creative ... до тех пор, пока вы пишете perms в / tmp - smci


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

PermitLocalCommand yes

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

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


3
2017-08-05 14:47



Эта директива установлена, да (и я предполагаю, что не увижу сообщение об ошибке, если оно не было). Проблема с использованием .bashrc заключается в том, что у сервера разные имена хостов, и я хотел бы, чтобы разные имена хостов переводились в разные стартовые каталоги - Gareth
Если каждое имя хоста не имеет другого IP-адреса, сервер не сможет узнать, какое имя хоста вы запросили. Хотя HTTP-запросы предоставляют дружественный заголовок Host: для идентификации запрошенного имени узла, SSH-соединения этого не делают. - Fosco


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

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

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

connect <foldername>

Примечание. Возможно, вам придется выйти из системы и войти в систему после изменения переменной пути


3
2017-11-25 03:10



Я предпочитаю это предыдущему предложению, потому что «$ SHELL» всегда действителен, а «bash» может и не быть. Также использование «exec» - приятный штрих. - Dave
Дальнейшее уточнение должно было обеспечить, чтобы «cd» был успешным - «cd ~ / $ 1 && exec ...» - Dave


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


2
2017-08-05 15:03



Хорошо, удаление кавычек, похоже, помогает, но у меня все еще есть ошибки (см. Отредактированный пост) - Gareth


В вашей ~/.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 после этого выдается команда, но до того, как будут загружены файлы запуска оболочки. Опять же, это происходит в другой оболочке.

Попытайтесь пошаговую технику и сообщите мне, работает ли она для вас.


2
2017-08-05 18:21