Передайте фоновый флаг (и) через ожидают и ssh

Слушая совет Жабр, вот версия, которая использует временный файл и formail.

#!/bin/bash
TMPFILE=$(mktemp)

# save the message to a file
cat - >"$TMPFILE"
# extract the date header
DATE=$( formail -xDate: < "$TMPFILE" )
# convert to the current timezone (defined by TZ)
DATE=$( date -R -d "$DATE" )
# output the modified message
echo "Date: $DATE"
formail -fI Date < "$TMPFILE"
# clean up
rm -f "$TMPFILE"
3
29.06.2011, 23:40
3 ответа

Geekosaur является правильным в указании, что можно передать амперсанд путем заключения в кавычки его, (Вы могли также выйти из него с подобным script eclipse \& ) но существует что-то еще, что мы могли, возможно, предложить лучший способ сделать здесь. Кажется, что Вы записали ожидать сценарий в ssh в другую машину с Вашим паролем и выполняете команду.

Необходимо знать, что и с практической точки зрения и с точки зрения безопасности это не очень хорошее решение. Практически, целая ситуация является хрупкой, и несколько потенциальных ситуаций могли заставить ее повреждаться, и отладка сбивает с толку в будущем. С точки зрения безопасности это является сумасшедшим, потому что Ваш системный пароль на другой машине сохраняется в текстовом файле где-нибудь!

Существует лучший путь! Основанная на ключе аутентификация была создана для решения этой проблемы. Вы создаете пары ключей - одна часть идет на сервер на одном на клиенте - которым позволяют пройти проверку подлинности без пароля. Это позволяет, Вы для выполнения ssh из сценариев без использования ожидаете И не сохраняя пароль нигде. Как дополнительный шаг Вы могли даже зашифровать локальный ключ с паролем и использовать агент или менеджера по брелоку для ключей для загрузки ключа в оболочку, прежде чем Вы запустите любые скрипты, которые должны будут использовать его.

Править: Я пропустил это, Вы сказали, что не можете использовать аутентификацию с открытым ключом. Это - сумасшедший разговор. Я оставляю на виду свой ответ в пользу любых читателей, которые, возможно, также пропустили требование и не понимают, что Ваш сценарий является взломом :)

3
27.01.2020, 21:10
  • 1
    , который я знаю об основанной на ключе аутентификации, но Вы заметите в моем вопросе, что я сказал, что существуют причины, что я не имею право обсуждать, который препятствует тому, чтобы я использовал ключи. Я довольно знаком с установкой ключей для логинов SSH, и мне жаль, что я не мог просто использовать это. –  Doug Stephen 29.06.2011, 22:38
  • 2
    Не заметил, что Вы выходили из пространства также. В то время как я не думаю, что это заставило бы команду не работать, это не необходимо. Отраженный это в ответе на Ваш комментарий ниже также. –  Doug Stephen 29.06.2011, 23:02
  • 3
    @Doug: Это повредилось бы таким же образом, который повредило решение geekosaur. It не, что один или другой формат не работает внутри, ожидает, случается так, что не заключение в кавычки/выход пространства означало, что данные были отправлены как два отдельных аргумента вместо одного, и ожидайте, имел различные данные для работы с. Я только вышел из пространства, чтобы иметь то же влияние как ответ geekosaur, который я принял, будет работать. Это только, когда Вы сказали, что это привело это к сбою, я думал об упоминании альтернативы. глюк –  Caleb 29.06.2011, 23:05
  • 4
    . Я понимаю то, что Вы говорите теперь. –  Doug Stephen 29.06.2011, 23:06

Если бы Вы не должны были вводить пароль, то Вы могли бы сделать

ssh -t 'eclipse & exec bash'

-t флаг говорит ssh выделять терминал даже при том, что Вы даете ему название команды. Удаленная оболочка должна быть неинтерактивной, потому что она выполняет команду, но последняя вещь, которую она делает, exec bash, т.е. сама замена новым экземпляром оболочки, который является интерактивным. (Замена bash zsh или независимо от того, что Ваша любимая оболочка.)

Если необходимо ввести пароль, действительно необходимо ввести его в терминале некоторого вида (который является, почему Вам нужно expect если Вы собираетесь автоматизировать ту часть). ssh сознательно отказывается читать пароли из параметра командной строки или файла.

Одна вещь, которая может быть полезной, состоит в том, чтобы создать основное соединение SSH раз и навсегда, автожелезнодорожные перевозки на него. Пока ведущее устройство работает, можно установить ведомые соединения, которые не требуют никакой аутентификации. Вставьте следующие строки Ваш ~/.ssh/config:

Host nickname
HostName 10.101.0.133
ControlPath=~/.ssh-control:%l:%p:%r

Создайте основное соединение с ssh -MX nickname eclipse (внутри expect, если Вы все еще хотите передать пароль автоматически). Затем, пока Eclipse работает, можно сделать ssh nickname без переаутентификации.

4
27.01.2020, 21:10
  • 1
    +1 для предложения ControlMaster как способ обойти не имеющую основанную на ключе аутентификацию как опцию для сценариев. Сторона клиента фиксирует для незакрепляемой проблемы серверной стороны. –  Caleb 29.06.2011, 23:51
  • 2
    Аккуратный подход, я могу закончить тем, что использовал обоих; только потому, что после того, как я запущу Eclipse и сделаю некоторую работу, я склонен закрывать его, но оставаться подключенным к полю. Бездисплейное поле является на самом деле мозгом робота, на котором мы разрабатываем непосредственно вместо креста, компилирующего, таким образом, это - пони, который делает слишком много приемов для узкого решения для объема; вот почему я пытался сделать такой универсальный сценарий. Но это - хорошее решение в течение долгих промежутков времени в dev фазе. Кроме того, благодарит добавить ожидать тег. –  Doug Stephen 30.06.2011, 01:19
  • 3
    @Doug можно заменить eclipse sleep 999999999 иметь эффективно бесконечно долгое основное соединение. –  Gilles 'SO- stop being evil' 30.06.2011, 01:22

Заключение в кавычки использования: script 'eclipse &'. (Обратите внимание, что Вы не заключаете в кавычки $argv в expect сценарий; Tcl следует различным правилам от sh.)

2
27.01.2020, 21:10
  • 1
    Это заставляет оболочку удара выкладывать синтаксическую ошибку на удаленном конце, потому что ожидают, кажется, возвращает одинарные кавычки к фигурным скобкам. Я знаю, что мог изолировать каждый элемент в векторе аргумента, но я предпочту передавать весь вектор для создания сценария универсальным. Это, кажется, работает, если я выхожу из амперсанда. Но новая проблема теперь, кажется, что, если я передаю аргументы, сценарий никогда не добирается, взаимодействуют; как только переданные команды выполняют концы сессии SSH. Обновление моего вопроса отразить это. –  Doug Stephen 29.06.2011, 22:37
  • 2
    @Doug: Вы пробовали метод Escape в моем ответе вместо заключения в кавычки? Если бы это не работает, я предложил бы, чтобы сценарий обертки на удаленной стороне сделал фоновую обработку или изменил Ваши аргументы ssh, таким образом, Вы не имеете к фону вообще. –  Caleb 29.06.2011, 22:43
  • 3
    Mmm, да, Tcl мог бы хорошо сделать это. Теперь я должен попытаться помнить, как заставить его вести себя сам; только вещь, происходящая со мной первое, что пришло на ум, [puts $argv] вместо $argv, но мальчик настолько уродлив. (Гм, на самом деле "$argv" мог бы работать там задумываются о нем. Не помните Tcl, заключающий правила в кавычки, и книга долго теряется в перемещении.) –  geekosaur 29.06.2011, 22:46
  • 4
    @Caleb да, я сделал... Это на самом деле рассветало на мне, прежде чем Вы открылись и сказали это. Таким образом, это работает как ожидалось теперь, за исключением протеста, я вставил свое редактирование. –  Doug Stephen 29.06.2011, 22:47
  • 5
    @Caleb: Tclsh разворачивает переменную, полностью заключенную в кавычки, стиль Tcl, из-за пространства; изменение, как Вы выходите из него входящий, не поможет, потому что Tcl никогда не видит различия между двумя формами. (Оболочка разделяет их обоих прежде, чем передать его в.) –  geekosaur 29.06.2011, 22:47

Теги

Похожие вопросы