Слушая совет Жабр, вот версия, которая использует временный файл и 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"
Geekosaur является правильным в указании, что можно передать амперсанд путем заключения в кавычки его, (Вы могли также выйти из него с подобным script eclipse \&
) но существует что-то еще, что мы могли, возможно, предложить лучший способ сделать здесь. Кажется, что Вы записали ожидать сценарий в ssh в другую машину с Вашим паролем и выполняете команду.
Необходимо знать, что и с практической точки зрения и с точки зрения безопасности это не очень хорошее решение. Практически, целая ситуация является хрупкой, и несколько потенциальных ситуаций могли заставить ее повреждаться, и отладка сбивает с толку в будущем. С точки зрения безопасности это является сумасшедшим, потому что Ваш системный пароль на другой машине сохраняется в текстовом файле где-нибудь!
Существует лучший путь! Основанная на ключе аутентификация была создана для решения этой проблемы. Вы создаете пары ключей - одна часть идет на сервер на одном на клиенте - которым позволяют пройти проверку подлинности без пароля. Это позволяет, Вы для выполнения ssh из сценариев без использования ожидаете И не сохраняя пароль нигде. Как дополнительный шаг Вы могли даже зашифровать локальный ключ с паролем и использовать агент или менеджера по брелоку для ключей для загрузки ключа в оболочку, прежде чем Вы запустите любые скрипты, которые должны будут использовать его.
Править: Я пропустил это, Вы сказали, что не можете использовать аутентификацию с открытым ключом. Это - сумасшедший разговор. Я оставляю на виду свой ответ в пользу любых читателей, которые, возможно, также пропустили требование и не понимают, что Ваш сценарий является взломом :)
Если бы Вы не должны были вводить пароль, то Вы могли бы сделать
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
без переаутентификации.
eclipse
sleep 999999999
иметь эффективно бесконечно долгое основное соединение.
– Gilles 'SO- stop being evil'
30.06.2011, 01:22
Заключение в кавычки использования: script 'eclipse &'
. (Обратите внимание, что Вы не заключаете в кавычки $argv
в expect
сценарий; Tcl следует различным правилам от sh
.)
[puts $argv]
вместо $argv
, но мальчик настолько уродлив. (Гм, на самом деле "$argv"
мог бы работать там задумываются о нем. Не помните Tcl, заключающий правила в кавычки, и книга долго теряется в перемещении.)
– geekosaur
29.06.2011, 22:46