Выполнение «sed» через «spawn» в ожидаемый скрипт - PullRequest
1 голос
/ 08 марта 2012

Я пишу простой ожидаемый сценарий для доступа к удаленному серверу без ввода пароля с помощью окна командной строки.

Я могу получить доступ к удаленному серверу, и там яхочу изменить текстовый файл.Это изменение выполняется с помощью команды sed для нахождения «ключевого слова», строка, в которой находится это «ключевое слово», удаляется.

Часть кода, которая дает мне problem - комбинация ' spawn ' с ' sed ' - следующая

spawn sed -i -e '/keyword_to_delete/d' /home/my_file

Так как это происходит в спецификациифайл Я должен сделать это с помощью команды «spawn».Я включаю режим отладочной информации, и основная информация об ошибках на экране:

expect: set expect_out(buffer) "exit\r\nsed: -e expression #1, char 1: unknown command: `''\r\n"
cannot interact with self - set spawn_id to a spawned process

Я надеюсь, что я показал проблему здесь ясно и хорошо, если не сказать мне, и я попытаюсьсделайте это лучше.

Большое спасибо

CODE:

 set ip [lindex $argv 0]

 set port [lindex $argv 1]

 set password <PSWD>


proc sendPass {} {

global ip
global port
global password

spawn "/usr/bin/ssh" -X -p $port root\@$ip "-o StrictHostKeyChecking no" "-o UserKnownHostsFile /dev/null"

while {1} {
  expect {
    "IN"                     {break}
    "Are you sure you want"     {send "yes\r"}
    "assword"                   {send "$password\r"}
  }
}

spawn chmod 775 /etc/hosts
spawn sed -i -e {/operator/d} /etc/hosts
spawn sed -i -e {/default/d} /etc/hosts

send "exit\r"
expect eof

}; # end proc sendPass

#execute proc
sendPass


# script itself terminates
interact

И текущая ошибка: "sed: не удалось открыть временный файл / etc // sedDEb2Fx: В доступе отказано "

Ответы [ 3 ]

4 голосов
/ 09 марта 2012
  1. Опять же, я не эксперт по expect, но ваш скрипт ищет chmod и sed на вашей локальной машине, а не на удаленной машине. Разве вы не должны вместо этого использовать send chmod 775 ..., точно так же, как вы используете send exit для выполнения exit на удаленной машине?

  2. Так работает sed -i ... . Вы заметите, что вам нужно разрешение на запись в /etc, где будет создан временный файл. Чтобы избежать этого, вам нужно явно создать временный файл, не используя -i, например. sed -e /foo/d /etc/hosts > /tmp/hosts; mv /tmp/hosts /etc. Может быть, вам нужно cp вместо mv, но я не уверен ... Я слишком ленив, чтобы попробовать strace mv ... самостоятельно.

2 голосов
/ 08 марта 2012

Одинарные кавычки не имеют никакого особого значения для Tcl (вот вещи, которые имеют особое значение ), поэтому вы хотите

spawn sed -i -e {/keyword_to_delete/d} /home/my_file
1 голос
/ 08 марта 2012

Извините, я не очень знаком с expect(1), так как я напрямую использую SSH для таких задач:

ssh user@remote_server "sed -i -e '/keyword/d' /home/my_file"

Если вам действительно нужно использовать expect с telnet или чем-то еще, как насчет этого: сохраните скрипт sed где-нибудь в вашем remote_server, например /usr/local/bin/del_kw.sh, а затем выполните его ожидаемым образом. Я думаю, что это более управляемый способ решить вашу проблему. Существуют ли причины, по которым вы не можете использовать этот подход, например. потому что ваша система смонтирована только для чтения rootfs?

...