Bash

awk in ssh in su 中的命令替換

  • January 5, 2015

我正在創建一個腳本,它將 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 命令在此腳本中不起作用?

第一組引號被命令行 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}'

引用自:https://unix.stackexchange.com/questions/177593