Запустите команду в интерактивной оболочке с ssh после поиска .bashrc

11

Я хочу подключиться к удаленному компьютеру с Ubuntu, .bashrcустановить исходный код my и выполнить команду, которая зависит от параметров, установленных этим .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

Но потом, когда я снова пишу это вручную и запускаю, это работает!

Итак, как я могу убедиться, что .bashrcисточник перед вызовом команды?

Мехди
источник
Сообщение сбивает с толку. Я рекомендую не злоупотреблять такими командами; тем не менее, если вызывается команда bash или bash, я бы сказал, что .bashrc должен работать. Очевидно, есть некоторые различия или особенности выполнения такой команды, и для более серьезных приложений я бы порекомендовал Ansible или puppet.
Руи Ф. Рибейро
Я отредактировал свой вопрос. Вторая команда более проста и делает то же самое, но все еще без источника .bashrc.
Мехди
@RuiFRibeiro Злоупотребление ?? как вы можете назвать такую ​​простую вещь злоупотреблением ?? автоматический запуск команды после входа на удаленную машину с помощью ssh, это так просто. Любой внешний инструмент, который можно было бы использовать для такой смехотворно малой задачи, был бы излишним
Мехди
1
Просто фигура говорящего не была предназначена для использования в более широком смысле. Используйте их тогда, когда вам это нужно, однако использовать их не так мирно, как кажется. Тем не менее, для будущих ссылок взгляните на Ansible, вы будете удивлены, насколько он легок на самом деле. Я часто запускаю и команды через ssh.
Руи Ф Рибейро

Ответы:

9

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

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

Псевдонимы не раскрываются, когда оболочка не является интерактивной, если только параметр оболочки expand_aliases не установлен с помощью shopt (см. Описание shopt в разделе «Команды SHELL BUILTIN» ниже).

Это работает, если вы запустите его снова вручную, потому что последняя 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 будет игнорировать его.

Тердон
источник
Итак, вы предлагаете определить псевдонимы в alias_profile и вызывать их из .profile или .bash_profile?
Мехди
@ Мехди, это будет зависеть от того, что ты хочешь делать. В вашей системе Ubuntu ~/.basyrcон автоматически читается ~./profile, поэтому любые псевдонимы, определенные в ~/.bashrc, также будут доступны для чтения любых оболочек ~/.profile. Все, что вам действительно нужно было сделать, чтобы заставить это работать, - это явно запустить интерактивную оболочку ( -i).
Terdon
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"
Мехди
источник