web-dev-qa-db-ja.com

sshを介してリモートサーバーで変数を持つコマンドを実行します

/ homeディレクトリの所有権を変更するコマンドを実行したいと思います。例


例:

[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 root  root  4096  Sep  9  2014  user1
drwxr-xr-x. 17 root  root  4096  Sep  9  2014  user2
drwxr-xr-x. 17 root  root  4096  Sep  9  2014  user3
[root@remoteServer]#
[root@remoteServer]#id user1
uid=1101(user1) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1102(user2) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1103(user3) gid=1200(groupO)

このディレクトリの所有権を次のように変更します。

[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 user1  groupO  4096  Sep  9  2014  user1
drwxr-xr-x. 17 user2  groupO  4096  Sep  9  2014  user2
drwxr-xr-x. 17 user3  groupO  4096  Sep  9  2014  user3

このためにlocalServerのスクリプトを使用します。スクリプトは次のようになります。

#!/bin/bash
for ip in $(cat ipListFile)
do
        ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown $(echo $i | awk -F"home/" '{ print $2 }'):groupO $i; done;"
done

forループに問題があります。このループはremoteServerローカルで機能しています。しかし、localServerでこのコマンドをremoteServerのリモートスクリプトとして使用することはできません。 localServerでこのコマンドを試してみると、「$ i」変数の値は「17123891」のようにばかげています。

2
Gefolge

ネイサンの答えを変えることで間違いを見つけました。解決策は、「\ $」のような各「$」文字で「\」文字を使用することです。したがって、最後のコマンドは次のとおりです。

    #!/bin/bash
for ip in $(cat ipListFile)
do
        ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown \$(echo \$i | awk -F"home/" '{ print \$2 }'):groupO \$i; done;"
done
2
Gefolge

最も簡単な解決策は、スクリプトを送信してから実行することです。

for ...
do
   scp script.sh $ip:/tmp
   ssh $ip bash /tmp/sript.sh
   ssh $ip rm /tmp/sript.sh
done

複数のタイムアウトを回避するため

for ...
do
   if scp script.sh $ip:/tmp
   then
      ssh $ip bash /tmp/sript.sh
      sh $ip rm /tmp/sript.sh
   fi
done

すべての/home/userXuserXに属している必要があります

あなたが試すことができます

"ls -d /home/* | xargs -L1 basename | while read h ; do chown \$h:group0 /home/\$h ; done"
1
Archemar