динамическая загрузка псевдонимов локальной оболочки в сессию ssh

24

Когда я захожу на какой-либо компьютер с помощью ssh, я хочу, чтобы мои псевдонимы и функции были там. Другими словами, войдите в систему на каком-либо компьютере, и я хотел бы использовать ярлыки команд.

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

Примечания: Очень часто это первый раз, когда вы не знаете машину и файлы там. Иногда это единый вход. Только один раз для этой машины. После этого его необходимо очистить, также необходимо восстановить предыдущую конфигурацию.

Томек Видерка
источник

Ответы:

18

Вы можете временно скопировать свой .bashrcфайл на удаленный компьютер под другим именем. Например, используя .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

После этого вы можете войти на удаленный компьютер:

user@local$ ssh user@remote

и sourceфайл .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Теперь вы можете использовать свои .bashrcи свои функции. Когда вы закончите свою работу, вы можете удалить файл ~ / .bashrc_temp на удаленной машине и выйти из системы.

Копирование файла и вход на удаленный компьютер могут быть выполнены с помощью функции bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Обновление :

Вы можете также рассмотреть , чтобы скопировать .bashrcна /tmpна удаленной машине и источник /tmp/.bashrc_temp.

Обновление 2 :

Вы можете войти на удаленный компьютер с помощью ssh -t . Это автоматически использует ваш темп .bashrc. Обновленная функция s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
Jens-па
источник
Это определенно то, что я ищу. Благодарность! Но возможно ли сделать это более функциональным? В один шаг? Потому что теперь нам нужно 3 шага: войти в систему, источник, удалить перед выходом из системы.
Хорошо, теперь я вижу после вашего обновления. Отлично. Еще одно исправление: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"
Я добавил ваше исправление в свое обновление 2. Спасибо.
5
Почти все ответы (включая этот) используют предсказуемое имя файла в /tmp/. Это может легко использоваться любым другим пользователем для запуска любого кода в качестве пользователя, который входит в систему. Это следует использовать, mktempчтобы убедиться, что временный файл имеет уникальное имя.
Томецкий
9

Дженс-на предоставил отличный ответ. Я потратил немного времени и переделал его, чтобы немного улучшить работу. Таким образом, вы можете передать в SSH любой параметр, например номера портов. Разница в том, что он использует sshкоманду для загрузки .bashrcфайла, а не scpиспользует разные имена параметров команды.

Вы также заметите, что он загружает другой файл, .bashrc_remoteтак что вы можете выбрать именно то, что вы хотите получить на удаленных серверах, вместо всего

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Запустите его следующим образом:

sshs user@server

Название ' sshs' для "Источник SSH". Используйте, sshкогда вы не хотите, чтобы источник, и используйте, sshsкогда вы делаете.

https://gist.github.com/jonahbron/5549848

Ион
источник
Это полезно Тот же набор параметров, не нужно добавлять запись в ~ / .ssh / config только для указания другого порта нет!
Томек Видерка
Поскольку это одно и то же имя команды, возможно, это возможно сделать за один прогон и ввести пароль только один раз ... К сожалению, объединяя ваши команды в один отчет:Pseudo-terminal will not be allocated because stdin is not a terminal
Томек Видерка
@TomekWyderka Да, я пытался минут 20 сделать это одной командой, но не нашел пути. Возможно, человек более разбирающийся в BASH, чем я мог бы понять, но это не представляется возможным.
Иона
2
Я взял этот ответ и повторил его в течение нескольких недель. Результатом является полноценный инструмент, который решает проблему: github.com/Russell91/sshrc
RussellStewart
1
@Джона, можешь мне объяснить, почему ты использовал $ {*: 1} вместо $ @.
RussellStewart
8

Я думаю, что sshrc это то, что вы ищете: https://github.com/Russell91/sshrc

sshrc работает так же, как ssh, но он также получает ~ / .sshrc после удаленного входа в систему.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Вы можете использовать это для установки переменных среды, определения функций и запуска команд после входа в систему. Это так просто, и это не повлияет на других пользователей на сервере - даже если они тоже используют sshrc. Для более сложной конфигурации, продолжайте читать.

RussellStewart
источник
Ницца. Мне нравится ххд хак!
Томек Видерка
@Tomek - да, взломать xxd совершенно потрясающе. Я действительно пытался выполнить работу с scp. Затем с трубкой в ​​SSH. Это просто невозможно сделать без 2-х обращений к серверу - 2-х записей пароля - 2-х поездок. Это было недопустимо. Так что я сделал невероятное.
RussellStewart
У меня есть ошибка. sshrc висит без ответа. Можете ли вы поместить некоторый отладочный код (может быть в комментариях) в sshrc, чтобы я мог отследить его.
Томек Видерка
Интересный. Это всего лишь скрипт bash, поэтому обычно любые ошибки или предупреждения выводятся на экран автоматически. Сколько байтов в вашем .sshrc.d? Кроме того, просто введите vim $(which sshrc)и вы можете увидеть файл Bash. Вы можете добавить эхо-команды после каждой строки, чтобы увидеть, где она висит.
RussellStewart
5

Не уверен в ограничениях, но я смог заставить это работать с чем-то вроде:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
штифтик
источник
Это лучший ответ для меня, потому что это одна команда ssh, а не scp. Единственное оставшееся для меня улучшение - найти способ избежать этой RC_DATAпеременной.
Шридхар Сарнобат
2

Это то, что я придумал. Он позволяет вам поддерживать обычный rc-файл, но также делать все в одном ssh-соединении (то есть, нужно войти в систему только один раз, а не делать scp в первую очередь).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Я не уверен, насколько большим может быть этот rc-файл, поскольку в какой-то момент он может быть максимальным.

mlathe
источник
Я должен был обернуть часть команды в одинарные кавычки, чтобы это работало правильно. echo '`base64 .... sh`' - после этого все заработало прекрасно. Благодарность!!
К Робинсон
Если размер становится проблемой, вы можете передать содержимое файла с помощью утилиты сжатия, такой как gzip, до кодирования base64.
К Робинсон
2

Я думаю, что https://github.com/fsquillace/pearl-ssh делает то, что вам нужно.

Я написал это давным-давно, еще до рождения sshrc, и он имеет больше преимуществ по сравнению с sshrc:

  • Это не требует зависимости от xxd для обоих хостов (которые могут быть недоступны на удаленном хосте)
  • Pearl-ssh использует более эффективный алгоритм кодирования
  • Это всего лишь ~ 20 строк кода (очень легко понять!)

Например:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
user967489
источник
1

Один из вариантов заставить его работать с одним сеансом SSH - использовать переменную для хранения вашего bash-файла, а не копировать его.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Кажется, работает на меня.

gibsop1
источник
1

Я искал решение такой проблемы, как ваша, и понял, что я действительно искал sshfs. Может быть, вы тоже можете использовать это?

Моя проблема заключалась в том, что при работе с ssh'ом я хотел сохранить свои цвета, псевдонимы, функции и сценарии во время работы на расстоянии.

http://fuse.sourceforge.net/sshfs.html

Deifyed
источник
Лол, это никогда не приходило мне в голову. Это довольно креативное решение.
Шридхар Сарнобат