例えば、コマンドマクロ test.cm はリモートホストにログインして foo.cm コマンドマクロを実行します。
アタッチ入力
telnet 192.168.77.128
符牒
フーセンチ
|
図 1 - telnet コマンドマクロ test.cm |
display_line display_system_useage
表示システム利用度
display_line netstat -statistics -protocol tcp
netstat -statistics
display_line analyze_system -request_line 'stcp_meters -all -long' -quit
analyze_system -request_line 'stcp_meters' -quit
|
図2 - foo.cm |
残念ながらtelnetはコマンドマクロで実行するように設計されておらず、失敗してしまいます。
テスト
telnet:致命的なエラー - tcgetattr が失敗しました。
テストの3行目でエラーが発生しました。
command_processor.オブジェクトが見つかりませんでした。コマンドマクロでは
zvos#m17_mas>SysAdmin>Noah_Davids>test.cm
|
図3 - test.cmの実行に失敗 |
しかし、リモートホストに自動ログインした後にコマンドを実行する方法はいくつかあります。
send_cmds.c.
少し前にtelnetサーバに接続して文字列を送信し、出力を解析するプログラムを書いたことがあります。スクリプト言語はシンプルですが、シンプルなものであれば問題なく動作します。より広範な例を含むソースコードはここにあります。
スクリプトは基本的には送信文字列の後に待ち文字列が続きます。待ち文字列が表示されると、スクリプトは次の行に進みます。スクリプトには引数がありますが、図4ではパスワードにarg0を使用しているので、パスワードはスクリプトには保存されません。スクリプトの実行は図5の通りです。スペースを節約するために、各コマンドの出力を切り捨てています。ターミナルタイプを ascii に設定するまでは、文字位置文字列からの非制御文字が表示されていることに気づくでしょう。
//login
/login nd/Password?
/arg0/ready
/set_terminal_parameters -terminal_type ascii -pause_lines 0/ready
/foo.cm/ready
/quit/quit
|
図 4 - ログインして foo コマンドマクロを実行する send_cmds スクリプト |
send_cmds -IPAddress 192.168.77.128 -InputFilePath test.send_cmds -no_Verbose -a
+rg0 パスワード
PHOENIX CAC VOS テスト・システム (%phx_vos#m16)
*** 別のVOSリリースで起動するには、***を参照してください。
*** >Overseer>COMMON>cfg>reconfig_instructions *** *** >Overseer>COMMON>cfg>reconfig_instructions
OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m16
ログインしてください 08:15:01
ログインND
パスワードは?
Noah_Davids.CAC は %phx_vos#m16 で 13-04-21 08:15:01 mst でログインしました。
[f[J[?7l[20l=[1m[1;24r[f[J[J[24;80f
[0;1m用意ができました 08:15:01
[0mset_terminal_parameters -terminal_type ascii -pause_lines 0
[1mset_terminal_parameters -terminal_type ascii -pause_lines 0
準備完了 08:15:01
foo.cm
display_system_usage
モジュール %phx_vos#m16、G94330、OpenVOS リリース 17.1.0ax の使用統計。
全762.6時間(31.7日)アップ。
----CPU----- 最後の分 最後の5分 最後の時間 すべてのアップ時間
.. . . .
.時間 0.00 0.1% 0.02 0.1% 0.23 0.1% 191.65 0.1
netstat -statistics
tcp.
.. . .
201766 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは884、ptep 8D3E6000、Noah_Davids.CACです。
stcp_meters %phx_vos#m16 762:36:19 13-04-21 08:15:02
. . . .
bufdat が 678 回実行されました (平均 0.0002/秒)
08:15:02
準備完了 08:15:03
|
図 5 - send_cmds の実行 |
と期待しています。
gnu_library に expect というプログラムがあります。expect スクリプトの構文は非常に複雑で、異なる戻り値の文字列に基づいて分岐することができるので、単にタイミングアウトするのではなく、 エラーをインテリジェントに処理することができます。ウェブ上で"expect script examples"と検索してみてください。今回はログインしてfoo.cmマクロを実行するだけの簡単なスクリプトを紹介します。gnu_tools の初期バージョンにはバグがあったことに注意してください (それが send_cmds を書いた理由です) しかし、リリース 3.4.0a では問題ありません。ここでは示しませんが、expect は引数を使うこともできるので、パスワードはスクリプトの一部である必要はありませんし、スクリプトがパスワードの入力を要求することもできます。再度、スクリプトからのコマンド出力を切り詰めてみたところ、ターミナルタイプを ascii に設定するまでは、文字位置の文字列から非制御文字が表示されていることがわかります。しかし、Expect は文字列を異なる方法でフィルタリングするので、すべての文字が表示されるわけではありません。
スポーン "telnet"
期待値 "telnet>"
開く 192.168.77.128r」を送信する
ログインを期待する
ログインNDRを送る
パスワードを期待する
パスワルドを送る
きがつく
send "set_terminal_parameters -terminal_type ascii -pause_lines 0r"
きがつく
はっぴょう.cmrを送る
きがつく
|
図 6 - ログインして foo コマンドマクロを実行するスクリプトを期待する |
>bin>expect test.expect
スポーンテルネット
telnet> open 192.168.77.128
試してみると...
192.168.77.128に接続しました。
エスケープ文字は「^」です。]
PHOENIX CAC VOS テスト・システム (%phx_vos#m16)
*** 別のVOSリリースで起動するには、***を参照してください。
*** >Overseer>COMMON>cfg>reconfig_instructions *** *** >Overseer>COMMON>cfg>reconfig_instructions
OpenVOS リリース 17.1.0ax、モジュール %phx_vos#m16
ログインしてください 08:51:28
ログインND
パスワードは?
Noah_Davids.CAC が %phx_vos#m16 でログインしました at 13-04-21 08:51:28 mst.
fJ?7l20l
0;1m08:51:28
1mset_terminal_parameters -terminal_type ascii -pause_lines 0
準備完了 08:51:28
foo.cm
display_system_usage
モジュール %phx_vos#m16、G94330、OpenVOS リリース 17.1.0ax の使用統計。
全763.2時間(31.8日)アップ。
----CPU----- 最後の分 最後の 5 分 最後の時間 すべてのアップタイム
.. . .
.時間 0.00 0.1% 0.02 0.1% 0.24 0.1% 191.80 0.1
netstat -statistics
tcp.
.. . .
201926 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは895、ptep 8D2E1200、Noah_Davids.CACです。
stcp_meters %phx_vos#m16 763:12:46 13-04-21 08:51:29 .
.. . .
bufdat が 678 回実行されました (平均 0.0002/秒)
08:51:29
準備完了 08:51:29
|
図 7 - 期待されるスクリプトの実行 |
SSHです。
最後に、SSH を使ってリモートシステム上でコマンドを実行することができます。公開鍵認証を設定している場合は、実行時にパスワードの入力を求められることはありません。
SSHを使うと面白いしわ寄せがいくつかあります。最初の略語が効かない、dpsを実行しようとしない、display_print_statusを使う。
ssh [email protected] dbs
sh: dbs: コマンドが見つかりません
用意ができました 12:26:25
|
図8 - SSHを使ってリモートでコマンドの略語を実行してもうまくいかない |
ssh [email protected] display_batch_status
PHX_VOS#M16 のバッチ・キュー。
クエステートマックスランニングジョブズ
ノーマルラン5
用意ができました 12:26:43
|
図 9 - SSH を使ってリモートでコマンドを実行すると動作する |
次に、コマンドマクロを直接実行してもうまくいきません。出力がなく、マクロの最初のコマンドだけが処理されたように見えます。
ssh [email protected] 'foo.cm'
表示システム利用度
用意ができました 12:08:40
|
図 10 - SSH を使ってリモートでコマンドマクロを実行すると、必ずしもうまくいくとは限らない |
その代わりにシェルコマンドを実行し、その引数にコマンドマクロを与えなければなりません。
ssh [email protected] '/bin/sh foo.cm'
表示システム利用度
モジュール %phx_vos#m16、G94330、OpenVOS リリース 17.1.0ax の使用統計。
全766.5時間(31.9日)アップ。
----CPU----- 最後の分 最後の 5 分 最後の時間 すべてのアップタイム
CPU 分 0.02 0.5% 0.09 0.4% 0.91 0.4% 724.76 0.4%.
.. . .
単位時間 0.00 0.1% 0.02 0.1% 0.1時間 0.00 0.1% 0.02 0.1% 0.23 0.1% 192.57 0.1%.
netstat -statistics
tcp.
.. . .
202796 tcpOutRsts
analyze_system -request_line stcp_meters -all -long -quit
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは922、ptep 8D3C2780、Noah_Davids.CACです。
stcp_meters %phx_vos#m16 766:30:14 13-04-21 12:08:57 .
.. . .
bufdat が 678 回実行されました (平均 0.0002/秒)
用意ができました 12:08:59
|
図11 - SSHを使ってコマンドマクロをシェルスクリプトとして実行してリモートで実行する例 |
複雑なマクロは動作しません。例えば、コマンドマクロの各行は別のプロセスとしてフォークされるため、process_dir を使用して中間結果を保持するマクロは動作しません。analyze_system の呼び出しごとに異なるプロセス番号を報告していることに注意してください。
ssh [email protected] '/bin/sh foo3.cm'
%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-21 12:52:20 mst
表示 foo3.cm
表示線
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
analyze_system -request_line '' -quit
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは 1028ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは 1029ptep 8D3C3000, Noah_Davids.CAC
OpenVOS Release 17.1.0ax, analyze_system Release 17.1.0ax
現在のプロセスは 1030ptep 8D3C3000, Noah_Davids.CAC
準備完了 12:52:21
|
図 12 - マクロ内の各コマンドは別のプロセスとしてフォークされる |
VOS スタイルの変数を使ったコマンドマクロを使うと、シェルはそれが何であるかを知らないので、構文エラーが発生します。foo3.cm コマンドマクロは、自分自身を表示してから 9 までカウントします。表示コマンドが実行され、「&set」で構文エラーが発生します。
ssh [email protected] '/bin/sh foo3.cm'
%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-22 07:33:18 mst
display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again
foo3.cm: line 2: syntax error near unexpected token `&s'
foo3.cm: line 2: `&set COUNT 1'
ready 07:33:18
|
図 13 - VOS スタイル変数を使用したコマンドマクロは動作しません。 |
しかし、シェル変数を使用することで動作します。もちろん、それには既存のマクロの大規模な書き換えが必要になるかもしれません。以下は、シェルスクリプトと同じマクロの例です。
ssh [email protected] '/bin/sh foo3u'
ねこフーフー
カウント=1
while [[ $count -le 9 ]]
遣る
echo "$count"
(( count++ ))
済み
1
2
3
4
5
6
7
8
9
用意ができました 07:44:41
|
図14 - シェルのタイプ変数を使用したシェルスクリプトは動作します。 |
しかし、VOSスタイルのコマンドマクロをスタートプロセスとして実行し、生成されたアウトファイルを表示することができます。マクロ start_foo3.cm は start_process を実行し、プロセスが終了するのを待ってからヘッダーなしで出力ファイルを表示します。対話的に実行されるコマンドマクロからの出力をより完全に模倣するために、コマンドとマクロの行をオフにし、レディプロンプトもオフにするように foo3.cm を修正しました。
start_process foo3.cm -wait
display foo3.out -no_header
|
図 15 - foo3.cm を起動プロセスとして実行するコマンドマクロ |
最初の2行のログインヘッダとコマンドマクロ名、最後の"Process finished"行を除いて、結果はVOSのコマンドラインからマクロを実行した場合と同じです。
ssh [email protected] '/bin/sh start_foo3.cm'
Noah_Davids.CAC logged in on %phx_vos#m16 at 13-04-22 10:45:23 mst.
foo3.cm
%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-22 10:45:23 mst
&echo no_input_lines no_command_lines no_macro_lines
set_ready -format off
display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again
1
2
3
4
5
6
7
8
9
Process finished.
ready 10:45:25
|
図 16 - 起動したプロセスで foo.cm を実行した結果 |
だから、あなたが自動的にログインしてコマンドを実行するための他の方法であるtelnetを使用することはできませんが、あなたが見ることができるように。