在程序中将 bash 函数调用另一个函数的效果如何

How effectlively to call a bash function to another in a program

提问人:user2023 提问时间:2/3/2022 最后编辑:user2023 更新时间:2/4/2022 访问量:76

问:

我有下面的 Bash 脚本,我正在尝试创建用于为脚本中的输出文本创建颜色的函数,我正在尝试将这些函数调用到另一个函数中,但不知何故它不起作用。

我环顾四周,用谷歌搜索了一下,但没有得到任何具体的情况,有人可以帮我们了解,我做错了什么吗?

脚本:

#!/bin/bash
read -rsp $'Please Enter password below: ' SSHPASS
echo -n  ""
export SSHPASS

RED=$'\033[0;31m'; GREEN=$'\033[32m'; YELLOW=$'\033[1;33m'; BLUE=$'\033[0;34m'; ENDCOLOR=$'\033[0m'
#
function warning() {
  printf "${RED}[WARNING] %s${ENDCOLOR}\n" "$1" >&2
}

function information() {
  printf "${YELLOW}[INFO] %s${ENDCOLOR}\n" "$1"
}

function ok() {
  printf "${GREEN}[INFO] %s${ENDCOLOR}\n" "$1"
}

function hostclr() {
  printf "${BLUE}[INFO] %s${ENDCOLOR}\n" "$1"
}

function remote_connect() {
   target_host=$1

   sshpass -e ssh -q "${target_host}"  "true" -o StrictHostKeyChecking=no -o ConnectTimeout=60 2>>/dev/null
   if [[ $? -eq 0 ]]

   then
     SMBconf=$(sshpass -e ssh -q -t "$target_host" "grep -i vfs /etc/samba/smb.conf")

     if [[ $SMBconf == "" ]];then
         printf "%-20s %15s %5s %30s\n" hostclr "$target_host"  ok "NO VFS Stack found(not Vulnerable!)"

     elif [[ $SMBconf != "" ]];then
         printf "%-20s %15s %5s %30s\n"  hostclr "$target_host"  warning "Its Vulnerable!"

     else
         printf "%-20s %15s  %5s %30s\n" hostclr "$target_host" "Unable to get the ssh connection"
     fi
fi
}  2>/dev/null
export -f remote_connect
< samba_new_Servers xargs -P10 -n1 -d'\n' bash -c 'remote_connect "$@"' --
unset SSHPASS

结果: enter image description here

编辑:

我正在使用函数等hostclrok

bash 函数 参数传递 命令替换

评论

1赞 user2023 2/3/2022
@KamilCuk,我也在做同样的事情。:)
1赞 KamilCuk 2/3/2022
我明白了,shellcheck 没有警告这一点..不要使用 .只。请参见 wiki.bash-hackers.org/scripting/obsolete 。这只是一个风格问题。function name()name()

答:

1赞 chepner 2/3/2022 #1

您仍然必须使用命令替换来获取 et al. 的输出,以用作 的参数。okprintf

printf "%-20s %15s %5s %30s\n" "$(hostclr "$target_host")"  "$(ok "NO VFS Stack found(not Vulnerable!)")"

评论

0赞 chepner 2/3/2022
格式字符串有 4 个占位符,但只有 2 个参数为它们提供字符串。
0赞 chepner 2/3/2022
不过,它应该打印一些东西
0赞 user2023 2/3/2022
我已经把它改成了两个..printf "%-20s %15s\n" "$(hostclr "target_host")" "$(ok "NO VFS Stack found(not Vulnerable!)")"
0赞 KamilCuk 2/4/2022
你没有收到错误消息>吗?
2赞 KamilCuk 2/4/2022 #2

导出 -f remote_connect

您只导出了一个函数。您必须导出您使用的所有内容。

export RED GREEN YELLOW etc...
export -f remote_connect hostclr ok information etc...

评论

0赞 user2023 2/4/2022
你是冠军@KamilCuk,我的愚蠢......想不通。