ツール プログラミング

RLoginでポートフォワードを使わず自動ログインする




ものすごくひさしぶりにRLoginの話。

RLoginで踏み台の先にログインしたいときはポートフォワードを使うと便利です。
でも場合によってはポートフォワードが禁止されていることがあって。。。
大量のサーバーに繋ぐのが辛い。。。

ので、ポートフォワードを使わずに接続を自動化できるようにしました。

おさらい

この辺の話の応用的な。

RLoginでエックスサーバーにSSHする方法

みなさん、SSHしてますか(意味不明) WordPressは、ブラウザだけでサーバーのファイルを修正できるようになってます。 でも、1行追加するだけなのにダウンロード→編集→アップロードとかめんどくさ ...

続きを見る

RLoginで踏み台経由でログインする

お気に入りのWindwos用ターミナルRLogin そんなこと猫でもできる  2 PocketsRLoginでエックスサーバーにSSHする方法https://nekodeki.com/rlo ...

続きを見る

コマンドプロンプトでRLoginを起動してログインする

以前書いた、RLoginでサーバーにログインする方法 この方法は、RLoginの一番スタンダードな使い方だと思います。 接続設定を手動で作成する方式です。 ただ、この方法だと非常にまずい場合がありまし ...

続きを見る

自動化の手段を探る

自動化するにあたり、まずはどうやってアプローチするかを検討します。
とりあえずRLoginの仕様書を漁ってみるとチャットスクリプトスクリプトが使えそうです。
なおこの2つは全くの別物なので注意。

チャットスクリプト

プログラミングできなくても使えそう。
ただ、外部から変数の値を書き換えたりはできなさそうです。

スクリプト

チャットスクリプトよりプログラミングチック。
コマンドプロンプトから起動するときに外部読み込みするスクリプトのファイルを指定できます。

今回は外部からIPを渡して接続先を変えていきたいので、使うとしたらスクリプトになりそうです。

スクリプトに外部から値を渡せるか?

スクリプトサンプルの1つ目が自動ログインに使えそう。
引数を渡せれば動的にIPを変えられるけど

スクリプト仕様書を見ても引数渡す方法が書いてない。。。
コマンドラインからも渡す方法がなさそう。。。

これは困った。
このままだと接続したいIPの数だけスクリプトファイルを作らなければならず、自動化のメリットが薄れます。

スクリプトファイルを書き換えて増産しよう

まぁできないものは仕方ない。
スクリプトファイルを必要な数だけ作るのが避けられないとして、手で作るのは面倒すぎるのでここも自動でやることにします。

最終的にRLoginの起動コマンドを打てればPowerShellだろうがPythonだろうがなんでもいいのですが、私は基本的に人に配布する予定があるツールについては

  • 極力環境構築を不要にする
  • コピってすぐ使えるのが理想

というのを目標にしているので、今回は全部batchでやることにします。
だってWindowsPCなら絶対使えるから!
PowerShellはポリシーでエラー吐いたりするから嫌い!
batchもわけわかんなくて嫌いだけど!!

自動化全体図

こんな感じ。

実装

踏み台とその先のサーバーが同じユーザー名・パスワードでログインできる前提です。
RLoginには踏み台に入れるEntryを作成しておきます。

上の設定をもとにすると最終的にCMDで実行するコマンドはこんな感じ。

ipList.csv

踏み台から接続したいIPと起動する台数をCSV形式で書きます。
例えばこんな感じにすると、最終的にRLoginで5つのウィンドウが起動します。

scriptTemplate.txt

RLoginで踏み台に入った後に実行するScriptのTemplateを用意します。
ポイントは2つ。

置換用のIPとパスワード

batchで「ipStr」「passStr」という文字列を探して置換します。

!を^でエスケープ

batchで読み込んだときに!が消えてしまうので^でエスケープしておきます。
※RLoginに直接スクリプトを設定する場合は不要

RLogin_login.bat

全体の処理を行うbatch。
ポイントは3つですかね。

変数使用時の%%と!!の使い分け

通常batchで変数を使用するときは%%で囲みます。
ただ、これだとfor … do ()の中で変数をsetしても最新の値を使えない遅延環境変数という仕様が。。。

詳しくはQiitaなんかを読んでいただくとして。

forの中で変数をsetしたいときは

  • setlocal enabledelayedexpansionを書く
  • 変数の呼び出しは%%ではなく!!で囲む

としましょう。

文字列を置換

batchはreplaceのような関数がなく

!検索対象の文字列:置換対象の文字列=置換する文字列!

という書き方をするのですけど。
先に書いたように、遅延環境変数も!!で囲むわけで。。。

いやもう、遅延環境変数って誰得なんですかね。。。
動くことは動くけどさ。。。

RLoginはパスを通しておく

batch…というかコマンドラインでRLoginを実行するとき、RLogin.exeのパスを書いてもいいのですが。
どうせならコマンドっぽくRLoginだけで呼び出せるようにパスを通しておきましょう。

パスを通すの意味がわからない人はこれ。

実行

RLoginの準備と各ファイルが準備できたら以下コマンドをコマンドプロンプトで実行します。

RLoginの起動コマンドに/inuseオプションを付けているので、すでに起動中のRLoginがあればそのウインドウのタブとしてオープンします。
コマンドラインオプションは公式サイトで確認できます。

これでIPの種類や接続数がどれだけあっても、ipList.csvさえ作れば自動で対象サーバーにログインできるようになりました。

batch嫌いはちょっとだけ改善した、かも

今まで
batchってマジ意味不明。。。
全然思った通りに動かない。。。
嫌い。。。

って苦悩しながら書いてたんですが、今回ようやく遅延環境変数やforの結果で代入される変数の意味が理解できました。

tokensが複数、変数は%%aなどアルファベット1文字で指定
⇒ 2つ目以降値は%%b、%%cと指定した変数のアルファベットの連番?になる

って仕様考えたの誰なんですかね。。。
tokensが27個必要な場合はどうするんだ。。。

など文句はいっぱいありますがw
自由に書けるようになったらやれることの幅は広がりそうなので、機会があればまた使ってみようと思います。

-ツール, プログラミング
-

© 2022 そんなこと猫でもできる Powered by AFFINGER5