Сценарий оболочки работает по-другому на основе рабочего каталога.

Я написал следующий ожидайте сценарий для этого, и он работает (на моей зловещей). Пример выполнения:

./scp.exp <first host user> <first host user pass> <first host name> <second host name> <second host user> <second host user pass> <directory path i.e. /tmp>

Сценарий:

#!/usr/bin/expect -f
# ./sshlogin.exp uptime
# set Variables

set user [lindex $argv 0];
set password [lindex $argv 1];
set host [lindex $argv 2];
set copy_to_host [lindex $argv 3];
set copy_to_host_user [lindex $argv 4];
set copy_to_host_pass [lindex $argv 5];
set copy_to_host_dir [lindex $argv 6];
set file1 one.txt;
set file2 two.txt;
set timeout 10
# now ssh
spawn ssh $user@$host -o StrictHostKeyChecking=no
match_max 100000 # Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
expect "*$ "
send -- "scp -o StrictHostKeyChecking=no $file1 $file2 $copy_to_host_user@$copy_to_host:$copy_to_host_dir\r"
expect "*?assword:*"
send -- "$copy_to_host_pass\r"
expect "*$ " 
send -- "exit\r"
expect eof

Примечание: при работе с большими файлами может потребоваться добавить некоторое время ожидания для ожидания .

-121--230617-
for d in */*/*/*; do
  printf '%s: ' "$d"
  zcat -- "$d/"*.gz | grep -Fc STRING
done

подсчитывает количество строк, содержащих STRING.

Замените grep -FC STRING на grep -Fo STRING | wc -l (предполагается, что GNU grep ), чтобы иметь количество вхождений.

Замените zcat на gzip -dc , если zcat не поддерживает файлы .gz .

С помощью zsh и GNU grep можно сократить его до:

for d (*/*/*/*) zcat $d/*.gz | grep -FcH --label=$d STRING
-121--96797-

Назначение имени для сеанса экрана с помощью -S позволяет работать с этим сеансом (например, с помощью screen -r... ), указав его название.

При выборе опции -r :

-r [pid.tty.host]
-r владелец сеанса/[ pid.tty.host]
возобновляется сеанс отсоединенного экрана. Нет других вариантов (кроме com ‐ binations с -d/-D) может быть указан, хотя необязательный префикс [pid.] tty.host может потребоваться для различения нескольких отсоединенные сеансы экрана. Вторая форма используется для подключения к сеанс экрана другого пользователя, который выполняется в многопользовательском режиме. Это указывает, что экран должен искать сеансы в другом пользователе справочник. Для этого требуется setuid-root.

Поэтому имя сеанса с символом / интерпретируется как владелец/имя . (Это может быть задокументировано лучше под опцией -S .)

Вы можете сделать

screen -S $USER/name

, что эквивалентно:

screen -S name

В некоторых быстрых экспериментах с экранной версией 4,01,00, я не нашел никаких других специальных символов, запрещенных в именах сеансов. Все следующее:

screen -S 'foo bar'
screen -S 'foo"bar'
screen -S "foo'bar"
screen -S 'foo\bar'
screen -S "foo'bar^Xbaz"

работал правильно для меня.

В последнем ^ X фактически был литералом Ctrl-X . экран -ls показывает его буквально; Мне пришлось сделать screen -ls | cat -A , чтобы увидеть его. Я смог возобновить все эти сеансы, указав их имена:

screen -dr 'foo bar'

и т.д., и значение $ STY в каждом сеансе было правильным.

(Я не рекомендую использовать управляющие символы, что, я надеюсь, является очевидной причиной.)

1
03.03.2015, 08:29
1 ответ

Я вижу по крайней мере одну ошибку, которая могла бы объяснить проблему. Я не просматривал подробно ваш сценарий. Посмотрите, что делает эта строка:

  for line in `cat ${PARAMETERSFILE}`
  1. Возьмите значение переменной PARAMETERSFILE .
  2. Разделить это значение на пробел - в результате получается одно слово, если значение содержит только «обычные» символы.
  3. Выполнить расширение имени файла , также известное как подстановка для каждого слова. Это все равно приводит к одному слову, если значение переменной содержит только «обычные» символы.
  4. Запустите cat для указанного файла.
  5. Прочтите вывод cat , так как это подстановка команды .
  6. Разделить вывод команды на пробелы.На этот раз разделяемая строка содержит много символов новой строки и несколько пробелов; результирующие слова: [help] , backupdir = "Backup , Home , Directory , " , , user = "MySQL , База данных , Имя пользователя" ,…
  7. Выполните расширение имени файла , также называемое подстановкой для каждого слова.

На этот раз некоторые слова содержат символы подстановки, поэтому они будут интерпретированы как шаблон глобуса. Если шаблон не соответствует ни одному файлу, он остается как есть. Если шаблон соответствует хотя бы одному файлу, он заменяется списком совпадающих файлов.

Строка типа [help] представляет собой шаблон глобуса, который четыре возможных совпадения с односимвольными именами файлов: h , e , l ], p . Таким образом, если вы запустите сценарий в каталоге, который не содержит файлов ни с одним из этих имен, слово [help] останется неизменным, но если, например, текущий каталог содержит файл с именем h , тогда [help] заменяется на h .

для строки в… не разбивает ввод на строки. Самый простой способ сделать это -

while IFS= read -r line; do
  …
done <"$PARAMETERSFILE"

IFS = read -r line читает ровно одну строку, и никакой другой символ, кроме новой строки, не является специальным. Если вы хотите удалить начальные и конечные пробелы, удалите IFS = . Если вы хотите, чтобы обратная косая черта служила символом продолжения строки (т.е. обратная косая черта в конце строки игнорирует следующую новую строку), удалите -r .

0
28.01.2020, 01:43

Теги

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