使用多个函数在一行中获取输出

使用多个函数在一行中获取输出

我正在尝试从 Bash 脚本创建输出,其中包括主机名、SSH 协议和 root 登录信息。

我想使用 Bash 函数来做到这一点。我有一个.sh文件,但它不起作用。这段代码的问题出在哪里?

服务器版本:红帽7

预期输出为:

xyz|hostname|Protocol X|Root Access Denied

我想开始输出“xyz”以便稍后解析我的输出。

#!/bin/bash
     
host(){
         local tmpfile=$(mktemp)
         hostname > "$tmpfile"
         printf '%s' "$tmpfile"
}
     
protocol(){
        local infile="$1"
     
        cat /etc/ssh/sshd_config  | grep Protocol
}
     
rootlogin(){
        local infile="$1"
     
        if [[ $(sudo cat /etc/ssh/sshd_config | grep -i "PermitRootLogin yes" | grep -v "#PermitRootLogin yes") = "PermitRootLogin yes" ]];      
                echo  $host
        else
                echo "Root Access Denied"
        fi
}
}

tmpfile=$( host )
{
        host "$tmpfile"
        protocol "$tmpfile"
        rootlogin "$tmpfile"
} > fonk.out
     
rm -f "$tmpfile"

答案1

脚本的糟糕缩进和布局使问题变得混乱,但基本答案是

printf '%s|%s|%s|%s\n' "$(field1)" "$(field2)" "$(field3") "$(field4)"

重构为这个,并清理缩进等,你的脚本就变成了

#!/bin/bash

host(){
    hostname
}

protocol(){
    # avoid useless use of cat; get rid of unused parameter
    # ... do you need sudo here too?
    grep Protocol /etc/ssh/sshd_config
}

rootlogin(){
    # straighten out massive spaghetti pretzel; remove unused parameter
    # ... can you avoid sudo cat here?
    if sudo cat /etc/ssh/sshd_config |
        grep -v "#PermitRootLogin yes" |
        grep -i -q "PermitRootLogin yes"
    then
        # Fix quoting
        echo "$host"
    else
        echo "Root Access Denied"
    fi
 }

printf '%s|%s|%s|%s\n' "$1" "$(host)" "$(protocol)" "$(rootlogin)" >fonk.out    

最后一行有点推测性;您当前的脚本似乎根本没有打印第一个字段,并且不清楚它应该包含什么。

这不再使用临时文件,但您尝试的一种反模式是在不相关的函数中创建临时文件。当您确实需要临时文件时,单独创建它,然后在各处将其用作参数可能是个好主意。喜欢

tmp=$(mktemp) || exit
# arrange for temp file to be removed in case of errors or signals, too
trap 'rm -f "$tmp"' EXIT
trap 'exit' ERROR HUP QUIT TRAP TERM

function1 "$tmp"
function2 "$tmp"
: etc

相关内容