В настоящее время я использую SSHPass
в сценарии для соединения с удаленным сервером:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@1.1.1.1
и выполнить любую команду удаленно, я использую:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@1.1.1.1 "COMMAND"
Я планирую разделить шаг соединения в одном сценарии (conn.sh
) и команды в другом (cmd.sh
).
Я попробовал этот путь:
cmd.sh:
#!/bin/bash
ls -ltr
conn.sh:
#!/bin/bash
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@1.1.1.1 "$1"
И выполнение после предоставления обоих сценариев "chmod a+x":
./conn.sh cmd.sh
Но это дало мне ошибку:
cmd.sh: command not found
Я даже пытался заменить $1
с путем к cmd.sh
, но это дало мне эту ошибку:
sh: /home/myhome/cmd.sh: No such file or directory
Причина, которую это приводит к сбою, является этим при выполнении чего-то как
ssh user@remote command
command
не только выполняется на удаленной машине, она также разыскивается на удаленной машине. Поэтому, когда Вы работаете ./conn.sh cmd.sh
, Вы соединяетесь с удаленным, и затем Вы пытаетесь запустить названный скрипт cmd.sh
на удаленном. С тех пор нет такого сценария (это хранится на Вашей локальной машине), сбои выполнения, и Вы видите ту ошибку.
Можно сделать то, что Вы описываете путем изменения Вашего conn.sh
кому:
#!/bin/bash
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@1.1.1.1 \
bash -s < "$1"
И затем выполненный
./conn.sh /local/path/to/cmd.sh
Это откроет оболочку удара на удаленной машине. -s
говорит удару читать команды из стандартного входа и < "$1"
обеспечивает 1-й аргумент, данный conn.sh
как вход к той оболочке удара.
Вы уверены, что необходимо сделать это хотя? То, что Вы описываете, является почти наверняка проблемой XY. Простое решение состоит в том, чтобы создать cmd.sh
на удаленном сервере. Затем можно сделать
./conn.sh /remote/path/to/cmd.sh