Bash
使用 Multiple Function 在單行中獲取輸出
我正在嘗試使用 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