Назад | Перейти на главную страницу

Выполнить локальный псевдоним через ssh на удаленном сервере

Я знаю, что могу выполнить функцию через SSH на удаленном сервере, например:

$ ssh remote_server "$(declare -f cool_function); cool_function"

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

Я думал, это сработает:

$ alias very_cool_alias='echo A very cool alias'
$ very_cool_alias
A very cool alias
$ ssh remote_server "$(alias very_cool_alias);very_cool_alias"
bash: very_cool_alias: command not found

Хотя, если я проверю псевдонимы, псевдоним есть:

$ ssh remote_server "$(alias very_cool_alias);alias"
alias very_cool_alias='echo A very cool alias'

Почему работает функция, но не псевдоним, хотя он передается на удаленный SSH-сервер, как показывает последний пример? Есть идеи, что мне не хватает или как я могу этого добиться?

Я также пробовал установить опцию expand_aliases, но все равно получаю command not found:

ssh remote_server "shopt -s expand_aliases;$(alias some_alias);some_alias"    

Руководство Shell говорит нам:

Псевдонимы не раскрываются, если оболочка не интерактивна, если только параметр оболочки expand_aliases не установлен с помощью shopt ...

Однако он также упоминает

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

Это можно проверить локально: (ssh вызывает bash -c удаленно):

$ bash -c "shopt -s expand_aliases; shopt expand_aliases;alias x=ls; x"
expand_aliases  on
bash: x: command not found

Это действительно помогает сделать его многострочным:

$ bash -c "shopt -s expand_aliases; alias x='echo y'
> x"
y

И это также работает с ssh.

Вероятно, вам следует синхронизировать файлы .profile, .bash_profile и / или .bashrc, содержащие ваши любимые псевдонимы. Я предлагаю для удобства использовать rsync.