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-запрос. Я хочу, чтобы это было как можно меньше.

4 ответа4

3

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

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

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

$ . ./barfunc

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

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

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

Проверьте 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 на разумное значение). Предостережение заключается в том, что сервер должен быть настроен на прием переменных среды, что вряд ли будет иметь место при стандартной или безопасной настройке. Итак, вернемся к исходной точке, если ваша установка не позволяет этого.

0

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

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

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

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

$ func=$(scp yourname@yoursystem:~/barfunc /dev/stdout)
$ eval "$func"
$ bar_cat somefile ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .