ローカルコンピュータで指定されたシェル変数を使用してリモートサーバーでテキスト処理操作を実行する

ローカルコンピュータで指定されたシェル変数を使用してリモートサーバーでテキスト処理操作を実行する

SSHを介してリモートサーバーのユーザー情報を処理するシェルスクリプトを作成しようとしています。スクリプトは処理するユーザーを対話的に読み取ります。

  • 私の現在の試みは次のとおりです

    #!/bin/bash
    echo "Enter username which u want to add"
    read Student3
    ssh root@serverIP "useradd $Student3;"
    awk -F: '{print $1, $3, $6, $7}' /etc/passwd | grep "^${Student3}"
    

    空の出力を生成します。

  • 呼び出されない場合、grep出力は次のようになります。

    root 0 /root /bin/bash
    bin 1 /bin /sbin/nologin
    daemon 2 /sbin /sbin/nologin
    adm 3 /var/adm /sbin/nologin
    lp 4 /var/spool/lpd /sbin/nologin
    sync 5 /sbin /bin/sync
    shutdown 6 /sbin /sbin/shutdown
    halt 7 /sbin /sbin/halt
    mail 8 /var/spool/mail /sbin/nologin
    operator 11 /root /sbin/nologin
    
  • grep呼び出しを追加すると、空の| grep "^${Student3}"出力が表示されます。

答え1

追加しようとしているユーザーが上記のファイル/etc/passwdの場合は、ローカルで表示されます。離れてシステムで解析を使用するには、次のようにデータにアクセスする必要がawkあります。ssh

#!/bin/bash

read -r -p 'Username: ' user

# Add user and check the remote /etc/passwd file
ssh remote "useradd '$user' && cat /etc/passwd" |
awk -F : -v user="$user" '$1 == user { print $1, $3, $6, $7 }'

最後のパイプは次のように書くこともできます。

ssh remote "useradd '$user' && getent passwd '$user'" |
awk -F : '{ print $1, $3, $6, $7 }'

/etc/passwd上記のコードの両方の変形は、正規表現の一致を使用せず、代わりにフルユーザー名の文字列比較を実行することでこれを防ぎます^$user$user

関連情報