SSブログ

半自動的にLinuxのコマンドライン作業をしたい。 [Linux]

定型作業があって、たくさんのサーバで行わないといけない。SSHクライアントやLinuxのコマンドでなんとかならないかなぁと思っています。なんかどこかで見かけた覚えがあるんだけど、本気になってやろうと思っていなかったんだよね。

重い腰を上げてやろうと思ったのは、同じことを数十のサーバでやらないといけなくなったからで、毎回やるのはしんどいのである程度作り込んでも問題ないかなと思ったからです。とは言え、普通にコマンドラインを打つ以上のプログラミングはあまりしたくない、とかなりやる気なしなんですが。

そもそもパスワードも違うサーバ同士を一つのメソッドでやろうとするんだから、そこのところは別途どうにかしないといけない。パスワードを間違えた時のリカバリとか考えると途端に憂鬱なるんだけど、なんとか方法はないだろうか。

http://www.math.kobe-u.ac.jp/HOME/kodama/tips-expect.html

expectというのを入れると良さそうだが、各サーバに入れなきゃいけないようなので、その作業を考えるとしんどいかな。やはりクライアント側でごにょごにょやって済むならそうしたい。




とりあえずWindowsのSSHクライアントのRLoginにスクリプトなるものがあるから、それを使ってみた。スクリプトというからただ単に内容を標準入力に流す程度のものかと思っていたら、そこそこ色々できるマクロのようなものであった。

https://colo-ri.jp/develop/2014/02/rloginroot.html

sputs()を単独で実行させてみたけど、上のようにログイン作業を定型化しなくても使えるので、入ったサーバにそれぞれ任意の時に実行させることができる。そのため、Linuxにシェルスクリプトをアップして実行する手間が省ける。少し、サーバごとに変わっていても、ちょこちょこWindowsのエディタで書き換えて対応できるので、ちょっとした違いを考えてスクリプトに仕掛けを作らなくてもいい。

全部が全部自動化すると大変なので、ある程度は手作業を交えて作業をすることにした。10行あまりの実行にしても、ファイルを選んで一発で終わるので、省力という点では同じことをするんだったら、使わない手はない。

ただ残念なのがスクリプトファイルを他で開いていると実行できないという仕様になっていて、実行の度にエディタなどでファイルを閉じないといけない。あとコメントアウトは//でできるっぽいんだけど、公式サイトには出ていないっぽい。この二つはあまりよろしくないので、後で直した方がいいよと忠告しておこうと思っている。編集のためにファイルを開いているから実行できない処理系ってほとんどないので。

https://kmiya-culti.github.io/RLogin/script.html

RLoginとかが特殊なのかなと思っていたら、TeraTermにもマクロはあるらしい。でもTeraTermはいろいろ面倒なので、RLoginから戻ることはないかなと思ったり。




最後にSSH公開鍵登録のサンプルを上げておきますね。これは一部書き換えないとそのままでは使えないのはもちろんだけど、実行時にrootユーザーになっていないといけなかったりします。あと特定の場所にSSH鍵を置かないといけなかったりするので("id_rsa.pub.ユーザー名"のファイルを置く)、手動の部分は多いです。だけど、そこは自動化できるようなところではないので仕方ないですね。

user_name = "ユーザー名";

//ユーザーと.sshディレクトリを作る
sputs(sprintf("adduser %s\n", user_name));
sputs(sprintf("mkdir /home/%s/.ssh\n", user_name));
sputs(sprintf("chown %s:%s /home/%s/.ssh\n", user_name, user_name, user_name));
sputs(sprintf("chmod 700 /home/%s/.ssh\n", user_name));

//.sshに鍵を置く
sputs(sprintf("mv /home/ファイルを上げられるユーザ/id_rsa.pub.%s /home/%s/.ssh/authorized_keys\n", user_name, user_name));
sputs(sprintf("chown %s:%s /home/%s/.ssh/authorized_keys\n", user_name, user_name, user_name));
sputs(sprintf("chmod 600 /home/%s/.ssh/authorized_keys\n", user_name));

sputs(sprintf("ls -la  /home/%s/.ssh/\n", user_name));


本当はログインから自動化したかったんだけど、サーバによってパスワードが違う環境だったりしたのでできませんでした。他のサイトでそこのところはやっていたりするので、やりたい人は別のところを見てください。というか、コンテナとかでぽんぽん環境を作る場合はいろいろ方法はあるんだろうけど、そういう仕組みが使えない場合ってことで…。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0