Как сделать сценарий оболочки доступным везде, где я SSH

3

У меня есть сценарий оболочки, без которого я просто не могу обойтись: bar от Theiling Online

Я часто использую SSH на разных * nix серверах. Однако я не являюсь системным администратором и обычно не имею времени или привилегий для его установки на каждом сервере, к которому я подключаюсь.

Это, по-видимому, очень переносимый shсценарий, в котором есть параметры командной строки для экспорта себя в качестве функции оболочки, что заставило меня задуматься: могу ли я использовать одну из субъективно неясных функций OpenSSH, чтобы экспортировать ее везде, куда бы я ни пошел?

Моей первой мыслью было присвоить исходный код переменной среды, например, BAR = "cat -v"и затем выполнить ее с другой стороны как `$ BAR`, но 1) я даже не могу заставить пример cat работать локально, 2) я не знать, как поместить фактический многострочный источник скрипта в переменную окружения и 3) мне еще не удалось увидеть машину с PermitUserEnvironmentвключенным.

Я думаю, что я мог бы даже сделать с опцией ssh ​​написать файл с именем ~/barпри входе в систему, но более изменчивое решение было бы лучше.

Звонок wget http://.../barпри входе в систему будет неприемлемым.

Есть идеи?

PS Специфичные для шпатлевки решения, хотя я сомневаюсь, что они существуют, тоже подойдут

Редактировать: причина, по которой я не хочу использовать wget и другие файловые решения, заключается в том, что я не хочу оставлять отметку, поскольку иногда я подключаюсь как пользователь других пользователей или как root. Я также не хочу, чтобы каждый сервер, к которому я подключаюсь, делал HTTP-запрос. Я хочу, чтобы это было как можно меньше.

AIB
источник

Ответы:

1

Я не пробовал ничего из этого, но вы можете найти то, что вы ищете, с помощью комбинации опций.

Проверьте man 5 ssh_configдля:

  1. SendEnv- вы можете сохранить bar в переменную окружения, но затем вам нужно ее выполнить. Например BAR=$(bar -D), затем в удаленной оболочке eval $BAR, отправив переменную поверх - я знаю, что это на шаг меньше того, что вы хотите, но, эй, прогресс;
  2. LocalCommand - не уверен, что это помогает, если вы не можете сделать ssh без присмотра, но тогда я тоже не вижу, как это работает;

Единственный другой вариант, который я вижу, это взломать исходный код вашего клиента и ввести функцию, которая выполняет команду сразу после входа в систему ( eval $BARнапример, это может быть ssh_configопция, вызываемая, RemoteCommandнапример), после переменных среды. были отправлены и перед ожиданием ввода от пользователя.

...

На самом деле у меня есть идея для полного ответа (не проверено):

В SendEnv, убедитесь, что отправили PS1и DEFINEBAR, и установите PS1в eval $DEFINEBAR($ DEFINEBAR должен содержать вашу функцию и впоследствии установите PS1 на разумное значение). Предостережение заключается в том, что сервер должен быть настроен на прием переменных среды, что вряд ли будет иметь место при стандартной или безопасной настройке. Итак, вернемся к исходной точке, если ваша установка не позволяет этого.

asoundmove
источник
Кажется, AcceptEnv = LANG LC_*что все рассматриваемые машины имеют, что означает, что я мог бы использовать взломать как использование LC_BARвместо BAR. LocalCommandкажется, настроен локально, и я смог выполнить echo, но я не знаю, как экспортировать переменную среды (или две) оттуда. export x=yне работал
AIB
Кстати, LocalCommand работал так же, как вы думали RemoteCommand.
AIB
@aib, так что это означает, что LocalCommand выполняется перед запуском оболочки или как под-оболочка. Мудак. Не уверен, как выйти за рамки этого. Возможно, вы могли бы заставить LocalCommand создать файл с вашим скриптом, не так ли?
asoundmove
Понимаю. Я надеялся, что сделал что-то не так, например, не задал параметр --really-реально для экспорта. Я предполагаю, что это должен быть файл, тогда? Придется ли оставлять отметку на каждом сервере, к которому я подключаюсь?
AIB
3

Вот вариант решения Денниса Уильямсона, который не требует, чтобы вы были в состоянии ssh с удаленного компьютера обратно на ваш локальный компьютер. В локальной системе:

$ bar -D | ssh user@host 'cat > barfunc'
$ ssh user@host

В удаленной системе:

$ . ./barfunc

Я тестировал компоненты этого, но не использовал bar, чего у меня нет.

garyjohn
источник
Это, вероятно, то, что я в конечном итоге сделаю.
AIB
1

В своем вопросе вы сказали, что использование wget недопустимо. Вы против wget или против копирования файла? Я не думаю, что вы сможете получить желаемую функциональность, если не скопируете файл на локальный компьютер.

Может быть, вы можете получить файл (но я уверен, что это не удастся). Команде хотелось бы следующее в зависимости от оболочки:

source mymachine:/home/user/bar
. mymachine:/home/user/bar

если вы специально против wget, вы можете попробовать scp, с настройкой ключей ssh ​​это будет означать отсутствие пароля.

mkdir ~/bin; scp -r myserver:/home/user/bin/* ~/bin; chmod u+x ~/bin

Лично для меня работало помещать мои сценарии оболочки в хранилище Subversion, а затем проверять репозиторий на каждой машине. если я обновил скрипт, я могу проверить его обратно в SVN, а затем обновить его на других машинах.

Рой Рико
источник
+1 за контроль исходного кода, который я предложил нашему сисадмину. К сожалению, я не системный администратор, и машины могут не всегда иметь доступ к нашей офисной сети, где будет храниться репозиторий. Тем не менее, было бы неплохо разместить где-нибудь мои любимые сценарии оболочки в сети, обновляя их gitи загружая через HTTP.
AIB
0

Это может дать вам начало:

В вашей локальной системе:

$ bar -D > ~/barfunc
$ ssh user@host     # or similar

В удаленной системе:

$ func=$(scp yourname@yoursystem:~/barfunc /dev/stdout)
$ eval "$func"
$ bar_cat somefile ...
Деннис Уильямсон
источник