sshのawk suコマンドの置き換え

sshのawk 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コマンドラインで使用され、2番目の引用符セットsuはforコマンドラインで使用されるため、引用符ssh{ print $1}実際には3つの個別の引数として扱われますawk。エスケープ引用符(そして$と利用可能なその他の特殊文字):

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

または:

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

関連情報