завантаження локальних псевдоніїв оболонки для динамічної сесії 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"
}

Це, безумовно, те, що я шукаю. Спасибі! Але чи можна це зробити більш функціональним? За один крок? Тому що зараз нам потрібно 3 кроки: увійти, джерело, видалити перед виходом.

Гаразд, я бачу зараз після вашого оновлення. Чудово. Ще одне виправлення: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

Я додав ваше виправлення до мого оновлення 2. Дякую.

5
Майже у всіх відповідях (включаючи цю) використовується передбачувана назва файлу в /tmp/. Це може тривіально використовувати будь-який інший користувач, щоб запустити будь-який код як користувач, який входить у систему. Це слід використовувати mktempдля того, щоб тимчасовий файл мав унікальне ім'я.
Томецький

9

jens-na дала чудову відповідь. Я витратив трохи часу і трохи переробив це, щоб трохи краще працювати. Таким чином, ви можете передати будь-який параметр 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 спустити його до однієї команди, але не знайшов способу. Можливо, людина, більш підкований до БАШа, ніж я міг це зрозуміти, але, здається, це неможливо.
Йона

2
Я прийняв цю відповідь і повторював її протягом декількох тижнів. Результат - це повноцінний інструмент, який вирішує
RussellStewart

1
@Jonah, чи можете ви пояснити мені, чому ви використовували $ {*: 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. Для більш досконалої конфігурації продовжуйте читати.


Приємно. Мені подобається хак xxd!
Томек Відерка

@Tomek - так, хак xxd абсолютно приголомшливий. Я дуже намагався виконати роботу з scp. Потім з прошивкою в ssh. Це просто неможливо зробити без 2 дзвінків на сервер - 2 введення пароля - 2 туди і назад. Це було неприйнятно. Так я зробив немислиме.
RussellStewart

У мене клоп. sshrc висить без відповіді. Чи можете ви помістити код налагодження (можна в коментарях) в sshrc, щоб я міг його простежити.
Tomek Wyderka

Цікаво. Це просто баш сценарій, тому зазвичай будь-які помилки чи попередження, викинуті, будуть надруковані на екран автоматично. Скільки байтів у вашому .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, оскільки він може збільшитися в певний момент.


Мені довелося загортати частину команди в одинарні лапки, щоб отримати правильну роботу. відлуння '' 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

1

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

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

Здається, працює для мене.


1

Я шукав вирішити таку проблему, як ваша, і зрозумів, що я насправді шукав - sshfs. Можливо, ви також можете використовувати його?

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

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


Лол, це мені ніколи не спадало на думку. Це досить творче рішення.
Шрідхар Сарнобат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.