我正在尝试从 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