通过ssh运行本地脚本作为参数的本地文件

时间:2018-05-06 12:20:17

标签: bash ssh

我今天很难处理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

&#34; $ 2&#34;参数是我正在执行ssh的机器中的本地文件。脚本&#34; mod_users.sh&#34;添加或删除它从&#34; $ 2&#34;。

中读取的一堆用户

我要做的是执行脚本&#34; mod_users.sh&#34;通过ssh,从网络连接的机器批量添加或删除用户。另外,正如您所看到的,我要连接的所有机器都有我的公钥,所以我通过私钥/公钥对连接,以便远程机器不要求密码。

希望有足够的信息。如果你需要任何额外的,只要求它,我很乐意回答。

编辑:另外,是否可以在远程计算机上使用sudo运行脚本?

2 个答案:

答案 0 :(得分:0)

据我所知,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

它将在mod_users.sh生成的任何行之前插入sudo。但可能最好的方法是修补mod_users.sh。

答案 1 :(得分:0)

如果您更改mod_users.sh以接受$2中文件的文字,而不是文件的名称,并且远程用户的shell是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"