ホストに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}'