Я написал следующий ожидайте
сценарий для этого, и он работает (на моей зловещей).
Пример выполнения:
./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
Примечание: при работе с большими файлами может потребоваться добавить некоторое время ожидания для ожидания
.
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
в каждом сеансе было правильным.
(Я не рекомендую использовать управляющие символы, что, я надеюсь, является очевидной причиной.)
Я вижу по крайней мере одну ошибку, которая могла бы объяснить проблему. Я не просматривал подробно ваш сценарий. Посмотрите, что делает эта строка:
for line in `cat ${PARAMETERSFILE}`
PARAMETERSFILE
. cat
для указанного файла. cat
, так как это подстановка команды . [help]
, backupdir = "Backup
, Home
, Directory
, "
, , user = "MySQL
, База данных
, Имя пользователя"
,… На этот раз некоторые слова содержат символы подстановки, поэтому они будут интерпретированы как шаблон глобуса. Если шаблон не соответствует ни одному файлу, он остается как есть. Если шаблон соответствует хотя бы одному файлу, он заменяется списком совпадающих файлов.
Строка типа [help]
представляет собой шаблон глобуса, который четыре возможных совпадения с односимвольными именами файлов: h
, e
, l
], p
. Таким образом, если вы запустите сценарий в каталоге, который не содержит файлов ни с одним из этих имен, слово [help]
останется неизменным, но если, например, текущий каталог содержит файл с именем h
, тогда [help]
заменяется на h
.
для строки в…
не разбивает ввод на строки. Самый простой способ сделать это -
while IFS= read -r line; do
…
done <"$PARAMETERSFILE"
IFS = read -r line
читает ровно одну строку, и никакой другой символ, кроме новой строки, не является специальным. Если вы хотите удалить начальные и конечные пробелы, удалите IFS =
. Если вы хотите, чтобы обратная косая черта служила символом продолжения строки (т.е. обратная косая черта в конце строки игнорирует следующую новую строку), удалите -r
.