在 bash 自动登录脚本中指定第二种情况

在 bash 自动登录脚本中指定第二种情况

我在添加第二个案例时遇到问题。我编写这个小脚本来登录电脑并在其上执行命令。但我在定义命令的快捷方式时遇到问题。它应该看起来像这样,例如:

./script.sh 44 - 通过 ssh 登录这台电脑(可行)

./script.sh 44 r - 通过 ssh 重新启动这台电脑(这不起作用,因为我在定义第二种情况时遇到问题)

所以为了测试我写了它:

LOG="$LOG""$AUT""$NMBR""$NR""$DOMAIN" "$Command"
        $LOG

并定义一个变量

$Command
Command="sudo reboot"

但这个命令在电脑上不执行我做错了什么?

我把整个脚本放在下面。

DOMAIN="domain.domain.com"
PASS1="pass"
AUT="auth"
NMBR="001010"
LOG="sshpass -p$PASS1 ssh user@"
Command="sqlite3 /bin/ade/activity.sqlite 'Delete from state'"

if [[ $# == 0 ]]; then
    echo "Invalid script call, give location or number as parameter:"
    echo "2  / plau -    NR 2 / Pn | I don't think it exists ?"
    echo "44 / neun -    NR 00101044 / Neundorf"
    echo "45 / aks -     NR 00101045 / Anton-Kraus-Straße"
    echo "46 / chamiss - NR 00101046 / Chamissostraße"
    echo "47 / prei -    NR 00101047 / Preißelpöhl"
    echo "48 / sud -     NR 00101048 / Südvorstadt"
    echo "49 / capitol - NR 00101049 / Capitol"
    echo "50 / kgs -     NR 00101050 / Dr.-Karl-Gelbke-Straße"
    echo "51 / reusa -   NR 00101051 / Reusa"
    echo "52 / haus -    NR 00101052 / Seehaus"
    echo "53 / bus -     NR 00101053 / Busbahnhof"
    echo "54 / kn -      NR 00101054 / Knielohstraße"
    echo "55 / seume -   NR 00101055 / Seumestraße"
    echo "56 / neuels -  NR 00101056 / Neue Elsterbrücke"
    echo "57 / haupt -   NR 00101057 / Hauptfriedhof"
    echo "58 / tunnel2 - NR 00101058 / Tunnel II (Stadtgalerie)"
    echo "59 / hlp -     NR 00101059 / Hans-Löwel-Platz"
    echo "60 / tunnel4 - NR 00101060 / Tunnel iV (PSB-Service)"
    exit 1;
    
else

    case  in
        "44") NR="0001"; LOGY="sshpass -p$PASS1 ssh mtvm@$AUT$NR$DOMAIN" ;;
        "45") NR="45" ;;
        "46") NR="46" ;;
        "47") NR="47" ;;
        "48") NR="48" ;;
        "49") NR="49" ;;
        "50") NR="50" ;;
        "51") NR="51" ;;
        "52") NR="52" ;;
        "53") NR="53" ;;
        "54") NR="54" ;;
        "55") NR="55" ;;
        "56") NR="56" ;;
        "57") NR="57" ;;
        "58") NR="58" ;;
        "59") NR="59" ;;
        "60") NR="60" ;;
        
        "neun") NR="0001"; LOG2="sshpass -p$PASS1 ssh mtvm@$AUT$NR$DOMAIN" ;;
        "aks") NR="45" ;;
        "chamiss") NR="46" ;;
        "prei") NR="47" ;;
        "sud") NR="48" ;;
        "capitol") NR="49" ;;
        "kgs") NR="50" ;;
        "reusa") NR="51" ;;
        "haus") NR="52" ;;
        "bus") NR="53" ;;
        "kn") NR="54" ;;
        "seume") NR="55" ;;
        "neuels") NR="56" ;;
        "haupt") NR="57" ;;
        "tunnel2") NR="58" ;;
        "hlp") NR="59" ;;
        "tunnel4") NR="60" ;;
        *) echo "Incorrect parameter"; exit 1 ;;
        
        esac

            echo "Login on $LOG$AUT$NMBR$NR$DOMAIN"
            
        LOG="$LOG""$AUT""$NMBR""$NR""$DOMAIN" "$Command"
        $LOG
        
        LOG2="$LOG2"
        $LOGY
        
fi

答案1

这读起来很混乱。为什么不向我们展示在哪里你遇到麻烦了吗?事实上,这个脚本是 之间的缺失值case in,并且您有两行 LOG 表明您将按顺序进行两次 ssh 登录。

此行也不起作用,应该在空格周围引用分配的值,因为它会让 Bash 认为$Command应该使用LOG=...本地环境来执行。

LOG="$LOG""$AUT""$NMBR""$NR""$DOMAIN" "$Command"

可能应该是

LOG="$LOG$AUT$NMBR$NR$DOMAIN $Command"

而不是重新定义LOG混乱,只需这样做:

$LOG$AUT$NMBR$NR$DOMAIN $Command

我建议LOG*完全删除所有变量,这不是很可读,为什么要让别人配置调用什么命令? LOGY 和 LOG2 均仅针对主机 NR 0001 设置,但第一个仅当参数为数字时才设置,另一个仅当参数为字符串标识符时设置。仅仅是该主机的用户不同吗?那为什么不在user=mtvm那里使用呢。

无论如何,我认为如果必须将其写在一个脚本中,这或多或少是我会写的内容。我在另一个 case/esac 中添加了“sudo restart”:

# ... declare vars PASS1, DOMAIN, etc.
user=$(whoami)

# your argument checks and help output here

case $1 in
  neun ) shift; set -- 0001 "$@" ;;
  # other cases
esac

case $1 in
  0001 ) NR="$1"; user=mtvm ;;
  # other cases
esac

if [ $# -eq 2 ]; then
  case "$2" in r ) command="sudo reboot" ;; esac
fi

if [ -n "${command-}" ]
then
  sshpass -p$PASS1 ssh $user@$AUT$NR$DOMAIN $command
else
  sshpass -p$PASS1 ssh $user@$AUT$NR$DOMAIN
fi

假设主机名aut0001domain.domain.com看起来是错误的,但这就是它的作用。

相关内容