awk 在 ssh 中 su 在命令替换中

awk 在 ssh 中 su 在命令替换中

我正在创建一个脚本,它将 ssh 到主机并打印所有用户帐户以及它们何时到期。

在我可以运行的主机上awk -F':' '{ print $1}' /etc/passwd,它会给我所有用户帐户的列表。

我已将其添加到应该发送到服务器的脚本中,创建此列表并在其到期时使用它进行打印。

#!/bin/bash

for i in `cat /admin/lists/testlist`
do
  echo $i
  UNAME=`su - admin -c "ssh $i uname"`

  if test "$UNAME" = "Linux"
  then
    LIST=`su - admin -c "ssh $i awk -F':' '{ print $1}' /etc/passwd"`
    for j in $LIST
    do
      echo "$j " ; `su - batch -c "ssh $i sudo chage -l $j | grep Account"`
    done

  else
    echo "Exiting. The OS type is not found."
  fi

  echo "========================================================================"
  echo " "
done

exit 0

我遇到的问题是当我运行脚本时出现以下错误。

[admin@testserver bin]$ sudo checkPasswdExpiration.sh
testserver02
awk: cmd. line:1: {
awk: cmd. line:1:  ^ unexpected newline or end of string
========================================================================

为什么 awk 命令在此脚本中不起作用?

答案1

第一组引号被命令行 for 吃掉su,第二组引号被命令行 for吃掉ssh,因此引号{ print $1}实际上被 视为三个单独的参数awk。转义引号 ($,以及您可能使用的任何其他特殊字符):

su - admin -c "ssh $i awk -F: \'{ print \$1}\' /etc/passwd"

或者:

su - admin -c "ssh $i getent passwd" | awk -F: '{print $1}'

相关内容