Bash

使用 Multiple Function 在單行中獲取輸出

  • September 7, 2018

我正在嘗試使用 bash 腳本創建保留主機名、ssh 協議和 root 登錄資訊的輸出。

我想通過開發功能來做到這一點。我開發了 .sh 但它不起作用。

這個sh的問題在哪裡?

伺服器版本Red Hat 7

我的預期輸出應該是;

xyz|主機名|協議 X|根訪問被拒絕

而且我想開始輸出**“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" ]]; then
                      echo  $host
              else
                      echo "Root Access Denied"
fi
}

                                }


tmpfile=$( host )

   {
        host "$tmpfile"
        protocol "$tmpfile"
        rootlogin "$tmpfile"
} > fonk.out

rm -f "$tmpfile"

腳本的縮進和佈局不佳使問題變得混亂,但基本答案是

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

引用自:https://unix.stackexchange.com/questions/462677