Как я могу выполнить локальный сценарий на удаленной машине и включать аргументы?

Я ошибался, видят решение 1, которое действительно работает над debian

Я смог зафиксировать это "временно" путем изменения строки в /etc/default/automysqlbackup к следующему:

CONFIG_db_exclude=( 'information_schema' 'performance_schema' )

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

После последнего обновления мое решение, которое было на debian sid отказавшее, но действительно работает решение одно (который не работал на меня прежде). Это захватывает/etc/default/automysqlbackup и добавляет строку | grep-v ^performance_schema$. Вышеупомянутое исключает это, я использовал, прежде, кажется, проигнорированы в дампе.

118
10.07.2018, 09:46
3 ответа

Вы были достаточно близки со своим примером. Это работает просто великолепно при использовании его с аргументами, такими как они.

Демонстрационный сценарий:

$ 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>
164
27.01.2020, 19:29
  • 1
    Вы - Genius! Что я должен сделать для получения до уровня? У меня есть много из, разрабатывают сокращение. Большое спасибо. –  AllenD 20.08.2013, 05:21
  • 2
    @AllenD - просто продолжают задавать вопросы и пытаются участвовать на сайте так, как Вы можете. Я всегда пытаюсь изучить что-то новое каждый день. Перед Вашим вопросом я не знал, как сделать это также. 8-). Спасибо за Ваш вопрос! –  slm♦ 20.08.2013, 05:25
  • 3
    , что перенаправление может появиться в любой точке в команде: например, bash -s -- --time bye < ./ex.bash или даже < ./ex.bash bash -s -- --time bye. это вызвано тем, что оболочка сначала вынимает инструкцию по перенаправлению (независимо от того, где это находится в команде), затем настраивает перенаправление, затем выполняет остальную часть командной строки с перенаправлением на месте. –  lesmana 20.08.2013, 12:30
  • 4
    @sim я пытаюсь сделать эту точно ту же самую вещь, но из сценария, не из командной строки. Какая-либо идея того, как сделать это? По некоторым причинам включение Вашего точного ответа в обратных галочках не работает вообще. Это вместо этого запускает скрипт, указанный локально, и вывод отправляется как команда в удар по ssh –  krb686 03.03.2015, 23:42
  • 5
    @krb686 - Я спросил бы это как новый Q. –  slm♦ 04.03.2015, 03:33

Скажем, - это локальный файл, который содержит 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

-3
27.01.2020, 19:29

При обработке произвольных аргументов

Если вы действительно используете только одну строку, т.е. - время 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"
}

With Any POSIX- Соответствует / 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"
7
27.01.2020, 19:29

Теги

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