Запуск локального скрипта с локальными файлами в качестве параметров через ssh - PullRequest
0 голосов
/ 06 мая 2018

Сегодня мне трудно работать с ssh и bash. Мне нужно запустить скрипт с параметрами, которые являются локальными файлами, работающими через ssh-соединение. Вот скрипт, который обрабатывает соединение ssh:

#!/bin/bash
if [ $# -ne 3 ]
then
    echo "Incorrect number of parameters"
    exit
fi
cat "$3" | while read line; 
do 
    ssh -o ConnectTimeout=5 -i ./private_key as@$line < ./mod_users.sh "$1" "$2"
    if [ $? -ne 0 ]
    then
        echo "$line is not accesible" 
    fi
done

Параметр "$ 2" - это локальный файл в машине, с которой я делаю ssh. Скрипт "mod_users.sh" добавляет или удаляет группу пользователей, которые он читает из "$ 2".

Я пытаюсь выполнить скрипт "mod_users.sh" через ssh и добавить или стереть массовое количество пользователей с компьютера, подключенного к сети. Кроме того, как вы можете видеть, все машины, к которым я подключаюсь, имеют свой открытый ключ, поэтому я подключаюсь через пару секретный / открытый ключ, чтобы удаленные машины не запрашивали пароль.

Надеюсь, этого достаточно. Если вам нужна дополнительная плата, просто попросите ее, я буду рад ответить.

РЕДАКТИРОВАТЬ: Кроме того, возможно ли запустить сценарий с sudo на удаленном компьютере?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Если вы измените mod_users.sh, чтобы принять текст вашего файла в $2, а не имя файла, и если оболочкой вашего удаленного пользователя является bash ( не /bin/sh), вы можете сделать это:

ssh_args=( -o ConnectTimeout=5 -i ./private_key )
while IFS= read -r line <&3; do 
    printf -v args_q '%q ' "$1" "$(<"$2")"
    if ! ssh "${ssh_args[@]}" "as@$line" "bash -s $args_q" <mod_users.sh; then
        echo "Operation failed for $line" >&2 
    fi
done 3<"$3"

Если вы не хотите вносить это изменение в файл на диске, вы можете вставить соответствующий префикс в конвейер:

script_prefix='
tempfile=$(mktemp -t input.XXXXXX) || exit
trap '$'\'rm -f "$tempfile"\''' EXIT
printf "%s\n" "$2" >"$tempfile" || exit
set -- "$1" "$tempfile"
'

ssh_args=( -o ConnectTimeout=5 -i ./private_key )
while IFS= read -r line <&3; do 
    printf -v args_q '%q ' "$1" "$(<"$2")"
    if ! ssh "${ssh_args[@]}" "as@$line" "bash -s $args_q" \
            < <(printf '%s\n' "$script_prefix"; cat mod_users.sh); then
        echo "Operation failed for $line" >&2 
    fi
done 3<"$3"
0 голосов
/ 07 мая 2018

Как я понял, mod_users.sh и arg $ 1 являются локальными файлами, mod_users.sh генерирует команды для удаленных машин.

Вы должны сделать следующее:

./mod_users.sh "$1" "$2" | ssh -o ConnectTimeout=5 -i ./private_key as@$line bash

Также вы можете добавить sudo к этому:

./mod_users.sh "$1" "$2" | ssh -o ConnectTimeout=5 -i ./private_key as@$line "sudo bash" 

Если вы хотите сделать это более безопасным и предоставить права sudo для определенных команд, попробуйте следующее:

./mod_users.sh "$1" "$2" | sed 's/^/sudo /'| ssh -o ConnectTimeout=5 -i ./private_key as@$line bash

Он вставит sudo перед любой строкой, созданной mod_users.sh. Но, возможно, лучшим способом является исправление mod_users.sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...