호스트 이름, 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
마지막 줄은 약간 추측에 가깝습니다. 현재 스크립트가 첫 번째 필드를 전혀 인쇄하지 않는 것 같으며 여기에 무엇을 포함해야 하는지 명확하지 않습니다.
이는 더 이상 임시 파일을 사용하지 않지만 시도 중인 한 가지 안티 패턴은 관련 없는 기능에서 임시 파일을 생성하는 것입니다. 임시 파일이 꼭 필요한 경우 별도로 생성한 다음 어디에서나 매개 변수로 사용하는 것이 좋습니다. 좋다
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