seq 1 10 | while read a ; do
ssh HOST echo $a
done
のようにゃ処理は結構やってた気がするんだが、これにsudoを追加して
seq 1 10 | while read a ; do
ssh HOST sudo echo $a
done
にすると、にゃぜか1しか表示されにゃい。
かにゃり悩んで連打してたら希に3だの9だのまで表示されることがある。にゃんじゃこりゃ・・・結果が確率的に変化するとか何が起きてるんだ!?
というわけで頼りににゃるIRCに投げてみたらsshの仕様らしい。sudoがにゃくても再現する場合もあるとか。
ssh HOST echo $a 0</dev/null
にすればOKらしい。これは罠すぎるだろう。
で、man ssh読んでみるとssh -nがこれ相当らしいのだが、manだけ読んでても気づかにゃいよこんにゃの。
てことでsudoとは関係にゃく、
seq 1 10 | while read a ; do
ssh HOST echo $a
done
のようにゃ処理は
seq 1 10 | while read a ; do
ssh -n HOST echo $a
done
としにゃければ意図通り動かにゃい、ということで、メモ。
尚、
ssh -n HOST echo $a <<EOF
moemoe
EOF
といったヒアドキュメントやその他リダイレクトと併用してるとこんどはssh -nのおかげで動かにゃくにゃるわけで、にゃんかのライブラリににゃってたりするルーチンは状況をよく見てfixしておかにゃいとエンバグする。
あと今回の要件であれば、
seq 1 10 | while read a ; do
echo "$a" | while read b ; do
ssh HOST echo $b
done
done
のようにダミーのwhileを噛ますとまともに動くようだが、偶然動いてる可能性は捨てきれにゃいので本件は要お勉強ということで。
そんにゃわけでssh -A経由でrsync実行できるようにはにゃったのだが、sudoが挟まってると環境変数が引き継がれにゃいので公開鍵暗号が通らにゃい。
つまり
ssh -A host1 ssh host2 ls
は通るが、
ssh -A host1 sudo ssh host2 ls
は通らにゃい。
ssh -A host1 sudo var=$var ssh host2 ls
とすれば引き継げるはずにゃのだが、host1上での環境変数値で展開する方法がいまいち分からず。どういうエスケープすれば通るのかにゃぁこれ。.shにしてしまえばいいんだろうけど。
結局、visudoして環境変数を初期化しにゃいように変更。
ssh -A -o StrictHostKeyChecking=no host1 sudo rsync -e \'ssh -A -c arcfour,blowfish-cbc -o StrictHostKeyChecking=no\'-a --rsync-path=\'sudo rsync\' -v --inplace --stats --progress --human-readable --timeout=60 file user@host2:/tmp/
みたいにゃ書式で通るようににゃった。
sudoしてるのでniceかにゃにかつけたほうがいいかもやしれにゃい。
尚、visudoして変更しにゃくても、
ssh -A host1 sudo sh -c "env" \>/dev/null \; ssh -A host2 ls
でとりあえず延伸できるんで、途中の鯖でいろいろ追加しにゃいにゃらこっちで。
FreeNASでNICx2をroundrobinしたらCPUがINTで50%くらい食われて頭打ちににゃってたので、Interfacesのところでdevice pollingをONにして再起動・・・したら帰ってこにゃくにゃった。
見に行ったらIPが割り振られていにゃい。
いろいろ試行錯誤したがどうも挙動が怪しい。ひとまずLAGGを解除すると正常にもどる。configがにゃにか不整合を起こしたかと思ったがどうも違うみたい。
で、ここまでしてふと公式を見ると、
Enable 'polling' on interfaces used by a LAGG interface will make it inoperable.
とか書いてあった。分かってるにゃらGUI画面に書いとけ。
ていうかこれはLAGGしたらdevice pollingができにゃい? それって強烈にCPU食われるんじゃにゃいのかしら。