Bash Regex需要引起注意

时间:2018-11-07 17:50:51

标签: regex bash

我不知道这是一个重复的问题。我一如既往地进行研究,直到没有可行的解决方案或自己没有找到解决方案为止。我不是轻浮。 我可以在几分钟内在定界符处分割此字符串。这就是为什么我在这里。我有安全意识。这是来自命令行输入的用户输入。我正在尝试验证和验证用户输入,我不认为这是浪费时间。 我做的事情很简单,但是我的专业水平无法解决这个问题。 我正在从脚本中输入命令行选项,它分为三个变量。

$LOCAL_FILE
$DESTINATION_USER
$DESTINATION_FILE

在处理之前,我将使用scp和/ etc / hosts进行验证。

我以$DESTINATION_USER为例,例如:user @ xu4-node1-2并通过我无法正常工作的正则表达式运行用户(我在if条件下在其他地方使用它可以正常工作);验证格式并删除“ user @”部分,以便我可以awk / etc / hosts获取用户的IP,以便可以验证并将主机名和ip放入关联数组中(出于类似原因, )。

sUSER=$DESTINATION_USER
[[ "$sUSER" =~ "([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$" ]]
ip=$(awk '/^[[:space:]]*($|#)/{next}/'$sUSER'/{print $1; exit}' /etc/hosts)
declare -A dUSER[$ip]=$sUSER

例如,我需要验证用户输入“ user @ xu4-node1-2”并松开“ user @”部分,因此我所拥有的只是“ xu4-node1-2”,因此可以将其提供给awk给我ip。我的正则表达式却给了我整个“ user @ xu4-node1-2”

我在此使用正则表达式:

elif [[ $i =~ ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))* ]]; then

它工作正常。

**更新

我能够完成此代码来解决我的问题。我将其张贴在这里,以防它可以帮助其他任何人。我包括了对用户输入的验证和确认,但没有污染 尽管不在此代码段中,但也要从hosts文件中输入。我还包括一些错误处理。

    sUSER=$DESTINATION_USER
    sUSER="${sUSER#"${sUSER%%[![:space:]A-Za-z0-9._%+-]*}@"}"
    if [[ $sUSER =~ ^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ ]]; then
      ip=$(awk '/^[[:space:]]*($|#)/{next}/'$sUSER'/{print $1; exit}' /etc/hosts)
      if ! [[ $ip ]]; then
        printf "\n${LtRED} --> Error - No reference IP address found in /etc/hosts file for $sUSER\n --> Make sure that your hosts file is properly formatted${RESET}\n\n"
        exit 1
      fi
      declare -A dUSER[$ip]=$sUSER
    else
      printf "\n${LtRED} --> Remote user address ( $sUSER ) is not formatted properly - Try Again${RESET}\n\n"
      exit 1
  fi

0 个答案:

没有答案