Оболочка функции сценария Bash для удаленного выполнения команд SSH - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь создать функцию-оболочку SSH Bash, которая позволит мне выполнять команды удаленно. Цель состоит в том, чтобы иметь имя функции и параметры, которые передаются в функцию, не беспокоясь о том, как избежать кавычек. Вторичная цель (хотя и не такая важная) - захват результата выполненной команды.

Я пробовал различные методы, но ни один из них не работает в функции.

Вот два разных метода, с которыми я чувствую, что ближе всего к желаемому результату:

#!/bin/bash
s="srvr01"
ss="srvr02"

# Run commands on primary
function ssh1() {
  printf -v var "%s" "$*"
  ssh root@$s <<END
  x() {
    $*
  }
  x "$var"
END
}

# Run commands using secondary method
function ssh2() {
  printf -v var_str "%s" "$*"
  ssh -T -p 22 root@$ss $var_str
}

sshb() {
  ssh1 $*
  ssh2 $*
}

ssh1 echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
ssh2 echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf

Передав функцию в ssh и затем вызвав ее, я ожидал, что команды будут выполняться безопасным образом вместо получения:
строка 27: /etc/sysctl.conf: разрешение отклонено
строка 28: /etc/sysctl.conf: разрешение отклонено

1 Ответ

1 голос
/ 21 июня 2019

Вам необходимо заключить операторы перенаправления вывода в кавычки, иначе они будут обрабатываться вашей локальной оболочкой, а не передаваться в качестве параметров функции.

ssh1 echo 'net.ipv4.ip_nonlocal_bind=1' '>>' /etc/sysctl.conf
ssh2 echo 'net.ipv4.ip_nonlocal_bind=1' '>>' /etc/sysctl.conf

Вам также необходимо использовать eval в функции x(), потому что операторы перенаправления не обрабатываются после раскрытия переменных. И вам нужно экранировать $ в переменных, которые должны быть развернуты в удаленной системе.

function ssh1() {
  printf -v var "%s" "$*"
  ssh root@$s <<END
  x() {
    eval "\$1"
  }
  x "$var"
END
}

Я не уверен, в чем смысл этого printf, вы можете просто сделать var="$*", чтобы получить тот же результат. Вам даже не нужна переменная var, просто используйте x "$*" На самом деле, я думаю, я бы написал это как:

function ssh1() {
    ssh root@$s <<END
$*
END
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...