Я ошибался, видят решение 1, которое действительно работает над debian
Я смог зафиксировать это "временно" путем изменения строки в /etc/default/automysqlbackup
к следующему:
CONFIG_db_exclude=( 'information_schema' 'performance_schema' )
Я не уверен, какой эффект это имеет только тестовая работа восстановлений для меня, и резервное копирование завершается без ошибок.
После последнего обновления мое решение, которое было на debian sid отказавшее, но действительно работает решение одно (который не работал на меня прежде). Это захватывает/etc/default/automysqlbackup и добавляет строку | grep-v ^performance_schema$. Вышеупомянутое исключает это, я использовал, прежде, кажется, проигнорированы в дампе.
Вы были достаточно близки со своим примером. Это работает просто великолепно при использовании его с аргументами, такими как они.
Демонстрационный сценарий:
$ more ex.bash
#!/bin/bash
echo $1 $2
Пример, который работает:
$ ssh serverA "bash -s" < ./ex.bash "hi" "bye"
hi bye
Но это перестало работать для этих типов аргументов:
$ ssh serverA "bash -s" < ./ex.bash "--time" "bye"
bash: --: invalid option
...
Проблема, с которой Вы встречаетесь, состоит в том что аргумент, -time
, или --time
в моем примере, интерпретируется как переключатель к bash -s
. Можно умиротвориться bash
путем завершения его от взятия любого из остающихся параметров командной строки для себя с помощью --
аргумент.
Как это:
$ ssh root@remoteServer "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18
1.:
$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye"
-time bye
2.:
$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye"
--time bye
3.:
$ ssh serverA "bash -s" -- < ./ex.bash --time "bye"
--time bye
4.:
$ ssh < ./ex.bash serverA "bash -s -- --time bye"
--time bye
Примечание: Только, чтобы прояснить, что везде, где перенаправление появляется на командной строке, не имеет никакого значения, потому что ssh
называет удаленную оболочку с конкатенацией ее аргументов так или иначе, заключение в кавычки не имеет большого значения, кроме тех случаев, когда Вам нужно заключение в кавычки на удаленной оболочке как в примере № 4:
$ ssh < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'"
<--time bye> <end>
Скажем, - это локальный файл, который содержит ls
$ ssh servername "CAT | Bash"
Изменить 127.0.0.1 к тому, что ваш удаленный IP
Дайте сообщение о распределении псевдо-TTY, но они работают.
$ Cat A.a | SSH 127.0.0.1
$ SSH 127.0.0.1
или
$ CAT A.A | SSH 127.0.0.1 Bash или
$ SSH 127.0.0.1 Bash
Если вы действительно используете только одну строку, т.е. - время 18 августа 18
, тогда вы можете просто жестко его закодировать, и существующие ответы расскажут вам, как это сделать адекватно. С другой стороны, если вам нужно передать неизвестные аргументы (например, сообщение, которое будет отображаться в другой системе, или имя созданного файла, где конечные пользователи могут контролировать его имя), то потребуется больше внимания.
bash
или ksh
как / bin / sh
Если ваш удаленный / bin / sh
предоставляется с помощью bash или ksh, вы можете безопасно делать следующее с ненадежным списком аргументов, так что даже вредоносные имена (например, $ (rm -rf $ HOME) .txt
) могут безопасно передаваться в качестве аргументов:
runRemote() {
local args script
script=$1; shift
# generate eval-safe quoted version of current argument list
printf -v args '%q ' "$@"
# pass that through on the command line to bash -s
# note that $args is parsed remotely by /bin/sh, not by bash!
ssh user@remote-addr "bash -s -- $args" < "$script"
}
/ bin / sh
Для защиты от достаточно злонамеренных данных аргументов (попытка воспользоваться не-совместимым с POSIX цитированием, используемым printf% q
в bash, когда непечатаемые символы присутствуют в экранируемая строка) даже с / bin / sh
, который является базовым POSIX (например, dash
или ash
), это становится немного интереснее:
runRemote() {
local script=$1; shift
local args
printf -v args '%q ' "$@"
ssh user@remote-addr "bash -s" <<EOF
# pass quoted arguments through for parsing by remote bash
set -- $args
# substitute literal script text into heredoc
$(< "$script")
EOF
}
Вышеуказанные функции затем могут быть вызваны как:
# if your time should be three arguments
runRemote /var/www/html/ops1/sysMole -time Aug 18 18
... или ...
# if your time should be one string
runRemote /var/www/html/ops1/sysMole -time "Aug 18 18"
bash -s -- --time bye < ./ex.bash
или даже< ./ex.bash bash -s -- --time bye
. это вызвано тем, что оболочка сначала вынимает инструкцию по перенаправлению (независимо от того, где это находится в команде), затем настраивает перенаправление, затем выполняет остальную часть командной строки с перенаправлением на месте. – lesmana 20.08.2013, 12:30