Как запустить сценарий оболочки, расположенный на сервере Linux, из среды Windows?

Я пытаюсь запустить сценарий оболочки, расположенный на сервере Linux, из Windows. Сценарий оболочки выполняет две функции:

  • Выполните команду sed для замены текста в файле .sql в том же каталоге.
  • Запустите файл .sql с sqlplus.

Сценарий оболочки:

!/bin/sh
arg1=$1
arg2=$2
arg3=$(echo $arg1 | tr '[:lower:]' '[:upper:]')
arg4=$(echo $arg2 | tr '[:lower:]' '[:upper:]')
echo $arg1
echo $arg2
echo $arg3
echo $arg4   
sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql
sqlplus $arg2/$arg2@MYDB <<EOF
@sequence.$arg1.sql
exit;

(Моя база данных находится на том же сервере Linux.)

1) Скрипт работает правильно, когда я вхожу на сервер через MobaXterm

  1. Подключитесь к серверу с userID.
  2. Установите my_env.
  3. cd в каталог сценария оболочки.
  4. Запустить сценарий с ./myscript.sh с аргументами.

2) Тот же сценарий оболочки успешно запускается через .cmd вручную

  1. Создайте сценарий Windows test.cmd на моем ПК с Windows.
  2. В файле .cmd у меня есть строчка:

    plink.exe -ssh userID@Server
    
  3. После появления окна консоли я повторяю шаги 2–4, и скрипт успешно выполняется.

Что мне не удается, так это автоматизировать весь процесс.

Вот строка в моем файле .cmd, которую я попытался сделать:

plink.exe -ssh userID@Server /myfilepath/myscript.sh %arg1% %arg2%

Я могу видеть аргументы, переданные правильно, используя несколько echo в сценарии оболочки. Однако сценарию оболочки не удается найти файл .sql.

Журнал ошибок:

/mypath/myscript.sh[1]: !/bin/sh^M not found [No such file or directory]
myarg1value
myarg2value
:No such file or directory[myarg1value]
/mypath/myscript.sh[12]: sqlplus: not found [No such file or directory]

Я также пробовал ниже, но, к сожалению, с тем же результатом:

 plink.exe -ssh userID@Server -m command.txt

Где файл command.txt содержит:

. my_env
cd /filepath/
./myscript.sh %arg_with_actual_value%

Я не знаю, почему это не работает, особенно когда 2) работает и сценарий относительно прост.

Неправильно ли я предполагаю, что plink (путь, переменная и т. Д.)?

Cygwin - единственный выход?

Я старался не полагаться на еще один инструмент, поскольку использовал plink.

РЕДАКТИРОВАТЬ: Пока строка

sed -i "s/$arg3/$arg4/g" sequence.$arg1.sql

не запускается в .sh, я могу запустить его в самом файле .cmd через:

plink.exe -ssh userID@Server sed -i "s/%arg3%/%arg4%/g" /myfilepath/sequence.%arg1%.sql

Следовательно, я подозреваю, что проблема возникает из-за того, что файл .sh не имеет необходимых компонентов для запуска (т.е. устанавливает переменную env, путь и т. Д.)


person Alex    schedule 24.07.2019    source источник
comment
Интересно !/bin/sh^M в журнале ошибок. Сценарий оболочки обычно содержит вверху shebang, например #! /bin/sh. Файл сценария оболочки нуждается в интерпретаторе, и shebang сообщает Linux, какой исполняемый файл использовать в качестве интерпретатора для выполнения файла сценария. Этот shebang означает использование sh в каталоге /bin, который обычно является символической ссылкой на реально используемый исполняемый файл интерпретатора сценария оболочки. ^M представляет собой возврат каретки. Сценарий оболочки Linux не должен содержать возврата каретки. Он должен содержать только перевод строки в конце каждой строки.   -  person Mofi    schedule 25.07.2019
comment
Поэтому убедитесь, что command.txt в Windows и myscript.sh в Linux имеют только переводы строки и отсутствие возврата каретки, т.е. это текстовые файлы UNIX, а не текстовые файлы DOS / Windows. Правильная ли первая строка с . my_env в command.txt?   -  person Mofi    schedule 25.07.2019
comment
@Mofi Поскольку OP может запускать скрипт вручную из оболочки, это, вероятно, означает, что OP имеет хак в среда, которая позволяет выполнять сценарии даже с CRLF. И этот взлом недоступен в среде Plink. Так что в конечном итоге это, скорее всего, та же проблема, что и в связанном вопросе.   -  person Martin Prikryl    schedule 25.07.2019
comment
Спасибо вам обоим за вклад. После некоторого чтения я обнаружил, что интерактивный и неинтерактивный сеанс действительно отличается, но все еще не смог найти причину моей проблемы. Я провел небольшое тестирование и добавлю его в свой пост   -  person Alex    schedule 25.07.2019


Ответы (1)


Это не решение, но частично решила некоторую проблему благодаря Мартину Прикрылу и Мофи:

в command.txt необходимо указать следующее:

ORACLE_SID
ORACLE_HOME
ПУТЬ

после их установки sqlplus и sed будут работать нормально. Однако при передаче значений из .cmd через plink в сценарий оболочки Linux, похоже, возникает проблема с фактическим передаваемым значением. Переменной будет присвоено значение вместе с некоторыми нечитаемыми символами. В этом случае,

sqlplus $ arg2 / $ arg2 @ MYDB

вход в систему не выполняется, потому что arg2 содержит другой символ.

@ последовательность. $ arg1.sql

эта строка также не работает, поскольку она пытается открыть 2 файла, один из которых называется sequence.myvalue, а другой - "% s", что, как я подозреваю, назначенная переменная содержит какой-то нечитаемый символ следующей строки.

РЕДАКТИРОВАТЬ: исправлено, мы можем использовать ту же обработку, что и sed - запускать sqlplus непосредственно из plink вместо передачи значения и запуска сценария .sh в Linux:

sqlplus $arg2/$arg2@MYDB @/myfilepath/sequence.%arg1%.sql
person Alex    schedule 25.07.2019