ホスト名、SSHプロトコル、およびルートログイン情報を含むBashスクリプトから出力を生成しようとしています。
これを行うには、Bash機能を使用したいと思います。ファイルがありますが.sh
動作しません。このコードの問題は何ですか?
サーバーバージョン:レッドハット7
予想される出力は次のとおりです。
xyz|hostname|Protocol X|Root Access Denied
出力を開始したい「エクスシーズ」後で私の出力を解析します。
#!/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
最後の行は少し推測に近いです。現在、スクリプトが最初のフィールドをまったく印刷していないようで、ここに何を含めるべきかは不明です。
これは一時ファイルを使用しなくなりますが、試みているアンチパターンの1つは、無関係な機能から一時ファイルを生成することです。一時ファイルが必要な場合は、個別に作成してからどこでもパラメータとして使用することをお勧めします。良い
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