Привет всем,

В настоящее время у меня проблема с отправкой команд через SSH через командную строку на сервер. Чтобы иметь простой пример, я всегда посылаю команду "pwd", которая должна возвращать текущую папку, в которой вы находитесь.

Я успешно создаю исходное соединение SSH с помощью следующей команды:

sshg3 user@server#port 'pwd'

который подключается к серверу и замыкает домашнюю папку.

После этого я использую sudo su - user2 - потому что пользователь имеет больше прав как пользователь (необходимый для определенных задач):

sshg3 user@server#port "echo pwd|sudo su - user2"

Здесь, однако, если я хочу объединить несколько команд друг за другом, мне нужно вставить «» - иначе это не сработает:

sshg3 user@server#port "echo ""pwd;pwd""|sudo su - user2"

Если у меня нет или только один ", результат:

pwd
-bash: line 1: {homefolder}: is a directory

Теперь, после использования lftp, мне нужно загрузить данные на этот сервер, используя еще одного пользователя. Используя другой канал, я получаю это для работы с одной командой следующим образом:

sshg3 user@server#port "echo ""echo pwd|lftp -u user3 -p 1234 server2""|sudo su - user2"

И теперь возникает проблема: отправка нескольких команд на второй сервер не работает. Если я использую тот же шаблон, что и раньше (""), я получу такой результат:

sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

Это печатает:

echo pwd
bash: pwd|lftp -u user3 -p 1234 server2: command not found

Большую часть я получил, используя ответ в [этой] [1] ветке - но теперь я застрял.

Может кто-то помочь мне с этим?

2 ответа2

0

Я не совсем уверен, что вы пытаетесь сделать на удаленном сервере. Похоже, вы хотите выполнять команды, которые зависят от ответа других команд (например, pwd , который печатает рабочий каталог). Возможно, вы также хотите использовать пароль ("echo pwd") для su , я не уверен, какой.

Я бы предложил один из следующих подходов:

  • Напишите скрипт на удаленном сервере, который делает то, что вы хотите. Выполните этот скрипт через ssh . Дайте сценарию дополнительную информацию, такую как пароли, в качестве аргументов при его вызове.

  • Если вы не можете сохранить скрипт на удаленном сервере постоянно: все равно напишите скрипт, а затем передайте и выполните весь скрипт через ssh .

  • expect сценарий сложной интерактивной сессии через ssh , где вы вызываете различные программы, которые, в свою очередь, ожидают ввода данных пользователем.

В любом случае, я не думаю, что вы будете слишком возиться с echo .

0

Я думаю, что у вас есть проблема XY. Если бы вы могли рассказать нам о том, что вы пытаетесь достичь, а не о том, как вы пытаетесь достичь этого, то мы, вероятно, могли бы помочь ...


А пока, поскольку я не могу помочь с вашей первоначальной проблемой, давайте рассмотрим следующее:

sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

Bash разбит это на аргументы, основанные на пробелах без кавычек, поэтому аргументы таковы:

  1. sshg3
  2. user@server#port
  3. "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2"

После удаления цитаты из аргумента 3 это будет выглядеть так: (я не думаю, что это то, что вы хотели)

echo echo pwd;pwd|ltfp -u user3 -p 1234 server2|sudo su - user2

Вы можете подтвердить это следующим фрагментом.

Поместите вашу команду в массив с помощью X=( YOUR_COMMAND ):

$ X=(sshg3 user@server#port "echo ""echo ""pwd;pwd""|lftp -u user3 -p 1234 server2""|sudo su - user2")
$ for i in "${X[@]}"; do echo "${i}"; done
sshg3
user@server#port
echo echo pwd;pwd|lftp -u user3 -p 1234 server2|sudo su - user2

Очищенная версия аргумента 3 будет передана удаленной системе и (вероятно) будет интерпретироваться следующим образом:

  • Аргументы команды 1:

    1. echo
    2. echo
    3. pwd
  • Команда 2 аргументов: stdout подключен к stdin команды 3, потому что трубы / |

    1. pwd
  • Команда 3 аргумента: stdout подключен к командной 4 в stdin
    1. lftp
    2. -u
    3. user3
    4. -p
    5. 1234
    6. server2
  • Команда 4 аргумента:
    1. sudo
    2. su
    3. -u
    4. user2

Опять же, вы можете подтвердить это, войдя в систему и запустив очищенную третью строку из удаленной оболочки.


Есть несколько вещей, на которые следует обратить внимание:

  • Вы, вероятно, не echo pwd в stdout (именно это и сделает команда 1)
  • lftp не ожидает, что абсолютный путь (и ничто иное) будет дано на stdin
  • su скорее всего, не будет ожидать, что вывод lftp будет выдан на stdin ... su вызовет оболочку user2 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .