Виконайте команду в інтерактивній оболонці з ssh після пошуку .bashrc


11

Я хочу сш в віддалений комп'ютер Ubuntu, джерело мого .bashrcі запустити команду, яка залежить від встановлених цим параметрів .bashrc. Все це в інтерактивній оболонці, яка не закривається після виконання команди.

Те, що я намагався до цього часу, - це

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

або просто

ssh user@remote_computer -t "my_alias;bash"

Це працює для загальних команд (як lsнаприклад), але коли я намагаюся запустити псевдонім, визначений у, .bashrcя отримую помилку:

bash: my_alias: command not found

Але тоді, коли я знову напишу його вручну і запускаю, він працює!

Тож як я можу переконатись, що " .bashrca" отримано до виклику команди?


Пост заплутаний. Я рекомендую не зловживати такими запущеними командами; проте, якщо викликається команда bash або bash, я б сказав, що .bashrc повинен працювати. Очевидно, є деякі відмінності або особливості виконання такої команди, а для більш серйозних застосувань я рекомендую Ansible або маріонетку.
Rui F Ribeiro

Я відредагував своє запитання. Друга команда є більш простою і робить те саме, але все ж без джерела .bashrc раніше.
Мехді

@RuiFRibeiro Зловживання ?? як можна назвати таку просту річ зловживанням ?? автоматично запускаючи команду після входу у віддалену машину з допомогою ssh, це так просто. Будь-який зовнішній інструмент, який би розгорнувся для такої сміховинної невеликої задачі, був би надмірним
Мехді

1
Просто фігура, що говорила, не передбачалася використовувати в більш широкому розумінні. Використовуйте їх тоді, коли вам це потрібно, однак використовувати їх не так мирно, як здається. Тим не менш, для подальших посилань, подивіться на Ansible, ви будете вражені, наскільки це насправді легка вага. Я часто виконую також команди через ssh.
Rui F Ribeiro

Відповіді:


9

Проблема полягає в тому, що ви намагаєтеся запустити псевдонім у неінтерактивній оболонці. При запуску ssh user@computer command, commandзапускається не інтерактивні.

Інтерактивні оболонки не читають псевдоніми (від man bash):

Псевдоніми не розгортаються, коли оболонка не є інтерактивною, якщо не встановлено параметр shell_aliases оболонки за допомогою shopt (див. Опис простріленого під SHELL BUILTIN COMMANDS нижче).

Він працює, якщо запустити його ще раз вручну, оскільки фінальна bashкоманда запускає інтерактивну оболонку, тому ваші псевдоніми тепер доступні.

Як альтернатива, ви можете запустити інтерактивну оболонку ( bash -i) замість простої оболонки для входу ( bash -l) на віддаленій машині, щоб запустити свій псевдонім:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

Це здається дуже складним підходом. Ви не пояснили, чому саме це потрібно робити, але розгляньте такі варіанти:

  1. Просто запустіть звичайну інтерактивну оболонку для входу на віддаленій машині та запустіть команду вручну:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. Якщо ви завжди хочете, щоб цей псевдонім запускався під час підключення до цього комп’ютера, відредагуйте ~/.profile(або ~/.bash_profile, за наявності) віддаленого комп'ютера та додайте цей рядок наприкінці:

    my_alias

    Оскільки ~/.profileчитається щоразу, коли запускається оболонка для входу (так, наприклад, щоразу, коли ви підключаєтесь ssh, наприклад), це призведе my_aliasдо запуску кожного разу при підключенні.

    Зауважте, що за замовчуванням оболонки для входу читають ~/.profileабо ~/.bash_profileігнорують ~/.bashrc. Деякі дистрибутиви (наприклад, Debian та його похідні та Arch), наприклад, Ubuntu, мають за замовчуванням ~/.profileабо ~/.bash_profileджерело файлів, ~/.bashrcщо означає, що ваші псевдоніми, визначені в ~/.bashrc, також будуть доступні в оболонці для входу. Це не стосується всіх дистрибутивів, тому вам, можливо, доведеться редагувати ~/.profileвручну, щоб мати його джерелом ~/.bashrc. Також зауважте, що якщо ~/.bash_profileіснує, ~/.profilebash буде ігноруватися.


Тож ви б запропонували вказати псевдоніми в псевдонімі_профілі та назвати їх з .profile чи .bash_profile?
Мехді

@Mehdi, це залежатиме від того, що ти хочеш зробити. У вашій системі Ubuntu ~/.basyrcавтоматично зчитується ~./profile, тому будь-які псевдоніми, визначені в ~/.bashrc, також будуть доступні для будь-якого читання оболонок ~/.profile. Все, що вам дійсно потрібно було зробити, щоб це працювало - це явно запустити інтерактивну оболонку ( -i).
тердон

5

Мені довелося прокоментувати частину мого .bashrc, яка перешкоджала використанню псевдонімів та додала команду expand_aliases. Це прокоментували

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

І це додалося

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

Тоді моя команда спрацювала:

ssh user@remote_computer -t "my_alias;bash"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.