ソケット通信のアプリを作りたいのですが、よろしかったらご指導ください。
VB(Windows)からUNIXマシンのプログラムを起動するにはどうすれば良いのでしょうか。
WinSockを使ったサンプルソースが見れるサイトを知っていたら教えてください。
また良い書籍などあれば教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

telnetポートは23です。


23番に接続してください。
ウェルノウンポート(定義済みポート)についてはRFC1700で定義されます。
参考URLに一覧表があります。

telnetポートに接続後の動作は
1.recive:簡単なメッセージが数行とユーザ名要求
2.send:ユーザ名
3.recive:パスワード要求
4.send:パスワード
5.recive:簡単なメッセージ
6.send:コマンド送信
7.recive:ステータス(標準出力、標準エラー出力)
8.6と7を必要分繰り返し
9.send:ログアウトコマンド(logout,exit,^Dなど)
10.recive:簡単なメッセージ

reciveは「0バイト読みこみ」まで行ってください。
1行のメッセージが分割されて送られることがあります。

sendはデータの末尾に改行(文字コード&H0A)が必要です。

Socktコントロールを使ったことが無いので生でWinSockを使ったときの例です。
Socketコントロールのサービスで多少の違いがあるかもしれません。

参考URL:http://www.gdi.co.jp/org/port_no.html
    • good
    • 0
この回答へのお礼

ウェルノウンポートのURLは大変参考になります。
ポート接続後の動作については、現在、Socktコントロールに殆ど依存していますが、回答された内容と同様の流れになっているようです。(当然ですね)
詳細な回答、真にありがとうございました。

お礼日時:2001/04/05 11:52

誤解させちゃいましたね。

ごめんなさい。

#1で書いた手順はWindows側なので「プロトコル依存部分の前後にはWinSockの制御が必要」という意味です。

この回答への補足

納得しました。補足説明ありがとうございます。
ネットワーク知識が乏しいながらもがんばっているところです。
それでもWindows同士で基本的なことは何とか確認しました。

以下、大変あつかましいので、気が向いたらご回答ください。
1.rshdの動作していない場合(inetdは確認しました)、telnetで接続すると思
  いますが、このときポート番号は単純に514でよろしいのでしょうか。
  (ポート番号を知りたいとき、何を調べれば良いのでしょうか。)

2.1.が正しいとき、WinSockでコネクトした後、第一のメッセージ送信で
  「telnet ~」を送信すれば良いのでしょうか。
  (以後、telnetの範囲でシェルコマンドが使えるようになる)

3.接続が確立すれば、コマンド実行等による標準出力の結果を受取ることができ
  るのでしょうか。
  (WinSockのDataArrivalイベント及びGetDataメソッドは使用する)

補足日時:2001/03/23 20:03
    • good
    • 0

残念ながら適当なサイトは知らないので言葉だけで説明します。



unix上でinetdとrshdが動作している状態ならshellポート(514)に接続してrshからリモートコマンドを実行できます。
ただし、rshはセキュリティーホールになり得るのでLAN以外の環境ではオススメできません。
rshでなくtelnet(23)でも同じ事はできますが同様の問題が発生します。

手順としては
1.rsh(またはtelnet)ポートに接続
2.ユーザ認証
3.コマンド送信
4.ステータス受信
5.切断コマンド送信
もちろん前後にWinSockの制御は必要です。

コマンドによってはuucpが使える場合もあるし、機能限定ならRPCの方が安全です。
    • good
    • 0
この回答へのお礼

ありがとうございます。WinSockの制御をunix上に乗せるという点にちょっと疑問が残りますが(もしかしてWinSockを使うのは効率が良くないのかな)、回答していただいたところを中心に調べようと思います。

お礼日時:2001/03/22 15:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[WSH|JS|VB] telnetコマンドの標準出力を受け取りたい

こんにちは。

Windows Scripting Host(WSH)でtelnetコマンドのオートパイロット(自動操縦)をしたいと思っています。
そこで、ログインプロンプトなどを待つ際、waitで時間で待つのではなく、「login:」という文字を待ってログインするようにしたいのですが、できるでしょうか?教えてください。

WSHをご存知ない場合は、VBの範囲でお答えいただければと思います。適用できる可能性がありますので。
なお、言語は、JScript,VBScriptどちらでも構いません。

よろしくお願い致します。

Aベストアンサー

telnet コマンドは、実装が二つありますよね。95 にあった、Window アプリケーションのと
NT のコマンドプロンプトで動くやつ。

Window アプリケーションだと、キーを送り込むのは簡単だが、表示を取るのは、まず、不可能ですよね。

コンソールアプリケーションであれば、どうやってコンソールバッファのハンドルを取得するか
が、難しそう。

rsh もどきが作りたいのであれば、socket を扱うプログラムを作る方が、何百倍も簡単です。

# この回答が、期待に添わないであろう、という意味で自信無しにしておきます

QExcelでTelnetを動かしたい

長々と書いて申し訳ありませんが、困っています。
使用環境はWindows 2000です。開発環境というかexcel2000のVBAでコーディングしています。
で問題点が2点ありまして、
(1)EnumWindowsの所で止まるのですが、AddressOf演算子はexcel2000でも使えますよね。
 コンパイルエラー Sub、Function、または Property が必要です というエラーで止まります。
 何か使用方法が間違っていますでしょうか?
(2)テキストボックスを2つ用意してあるので、それを引数としてtelnetでつなぐパソコンを
 選べるようにしたいのですが引数でうまく渡せません(現状はコメントアウトしている部分です)。

Private Sub CommandButton1_Click()

box1 = TextBox1
box2 = TextBox2
'ipnum = "telnet xxx.xxx."box1"."box2

'待ち時間処理用の時刻の変数
newHour = Hour(Now())
newMinute = Minute(Now())
Shell "cmd.exe"
lRet = Shell("C:\WINNT\system32\cmd.exe", vbNormalFocus)
newSecond = Second(Now()) + 5
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

Call EnumWindows(AddressOf Rekkyo, 0)
lRet = FindWindow(vbNullString, "C:\WINDOWS\system32\cmd.exe")
Call SendMessage(lRet, WM_SYSCOMMAND, WM_MAXIMIZE, ByVal 0&)
Call PostMessageStrings("telnet xxx.xxx.xxx.xxx")
'Call PostMessageStrings(ipnum)
Call PostMessageStrings("xxx.bat")
Call PostMessageStrings("exit")
Call PostMessageStrings("exit")

End Sub

Public Function PostMessageStrings(strPost As String)
Dim i As Integer
'1文字ずつ分解して送信
For i = 1 To Len(strPost)
Call PostMessage(lRet, &H102, Asc(Mid(strPost, i, 1)), 0)
Next
'送信後に改行コードを送信
Call PostMessage(lRet, &H102, 13, 0)
End Function

標準モジュールに、こんな感じでAPI関数を記述してあります。
他のAPIも記述してありますが、割愛してあります。
'ウィンドウのハンドルの取得
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

誰か教えてください。よろしくお願いします。

長々と書いて申し訳ありませんが、困っています。
使用環境はWindows 2000です。開発環境というかexcel2000のVBAでコーディングしています。
で問題点が2点ありまして、
(1)EnumWindowsの所で止まるのですが、AddressOf演算子はexcel2000でも使えますよね。
 コンパイルエラー Sub、Function、または Property が必要です というエラーで止まります。
 何か使用方法が間違っていますでしょうか?
(2)テキストボックスを2つ用意してあるので、それを引数としてtelnetでつなぐパソコンを
 選べるように...続きを読む

Aベストアンサー

>デバックモードで値を見ているとlRetに何も入っていないのでここが悪いと思うのですが

FindWindow() の戻り値が、でしょうか?
それとも、PostMessageStrings() の中で、でしょうか?

よく見てみると lRet がどこで宣言されているのかわかりませんね。
Sub CommandButton1_Click() の中で
Dim lRet As Long
と宣言しているのでしょうか?
そうだとすると、PostMessageStrings() の中の lRet は PostMessageStrings() の中で暗黙に宣言されたものとみなされてしまうので、PostMessageStrings() の中 lRet は 0 になってしまいます。
(General) の (Declarations) で
Private lRet As Long
と宣言するか、PostMessageString() にウィンドウハンドルの引数を追加する必要があります。
だいたい、↓こんな感じですね。
(テキストボックスから取得するところはご自分で適当に直してください。)

(General) - (Declarations)
Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMillsecounds As Long)
Private Const WM_CHAR = &H102

Private Sub CommandButton1_Click()
Dim lngRet As Long
Dim hWnd As Long

lngRet = Shell("cmd.exe", vbNormalFocus)

Sleep 100

hWnd = FindWindowA(vbNullString, "C:\WINDOWS\system32\cmd.exe")

SendString hWnd, "telnet xxx.xxx.xxx.xxx"

End Sub

Private Sub SendString(ByVal hWnd As Long, ByVal s As String)
Dim i As Integer
Dim c As String

For i = 1 To Len(s)
c = Mid(s, i, 1)
PostMessage hWnd, WM_CHAR, Asc(c), 0
Sleep 10
Next i

PostMessage hWnd, WM_CHAR, Asc(vbCrLf), 0

End Sub

>デバックモードで値を見ているとlRetに何も入っていないのでここが悪いと思うのですが

FindWindow() の戻り値が、でしょうか?
それとも、PostMessageStrings() の中で、でしょうか?

よく見てみると lRet がどこで宣言されているのかわかりませんね。
Sub CommandButton1_Click() の中で
Dim lRet As Long
と宣言しているのでしょうか?
そうだとすると、PostMessageStrings() の中の lRet は PostMessageStrings() の中で暗黙に宣言されたものとみなされてしまうので、PostMessageStrings() の中 lR...続きを読む

QteratermマクロをVBAで実行

teratermマクロについてご教示願います。

teratermマクロを組んで、Linuxサーバにログインして処理をする.ttlファイルを作成しようと思っています。
その.ttlファイルを、VBAのプログラムから実行することは可能でしょうか?

やりたいことは、EXCELのシート上にある「実行」ボタンを押下すると、VBAからteratermマクロが実行される、という処理です。

可能かどうか教えてください。また、もしご存じであればその際の
VBAの組み方も同時にご教示いただければと思います。
よろしくお願いいたします。

Aベストアンサー

/Mオプション付で Shellで起動すればいいのでは

Shell "TeraTermのフルパス /M=マクロファイル"
といった具合でしょう

Qsedなどで、特定の文字列の後の文字列を抽出したい

sedなどで、特定の文字列の後の文字列を抽出したい

シェルスクリプト内で、sedなどを使って特定の文字列の後の文字列を抽出したいのですが、どうすればいいでしょうか?

たとえば、abcXYZ123defghiのなかから、XYZの後の「123」を抜き出したいです。

echo abcXYZ123defghi | sed ...

のようにして実行させたいです。

Aベストアンサー

日本語対応sedだと日本語数字混じりでもできますね。

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/' -e 'y/0123456789/0123456789/'
12357

※ 使っている日本語コードの指定は必要かも(例えば、 --ctype=EUC)

echo abcXYZ12357defghi | sed -e 's/^.*XYZ\([0-90-9]*\).*$/\1/'
12357

※ 入力フォームに書いている時はASCIIと日本語の判別がし易いけど回答見るとわかり難いですね。後ろの例での結果57とy/0123456789/の数字部分が日本語です。

Qwindows7からUNIXへのrsh方法

お世話になっております。

現在windows7(A)からSUAを使用してunixサーバ(B)へリモートシェルを
実行したく調査しております。

unixからwindows7へのrsh(以下のコマンド)は成功するのですが
肝心の逆windows7からunixのrshが
「permission denied 」となり失敗してしまいます。

■テストコマンド
(1)windows7(A)からunix(B)へ
   rsh B -l Buser ls   ← 失敗
(2)unix(B)からwindows7(A)へ
   rsh A -l Auser ls    ← 成功

「.rhosts」や「hosts」の設定等は行い、rloginができることは
確認しております。(AからBとBからA両方ともOK)

何か設定等が間違っているのでしょうか?

宜しくお願い申し上げます。

Aベストアンサー

No6です。

No6:> unixサーバってなんでしょうか。
No6:> どのunixサーバでも同じではない部分に見えますが。

No6補足:> /etc/pam.d/の設定見直しました。
No6補足:> 設定できていなかったので設定してみたのですが
No6補足:> 結果は同じでした。。。

pamの設定を行なって変わらなかったとしたら、pamを使ってないか新たに行なったpamの設定が正しくないか。

No6お礼:> unix(B)はLinux version 2.4.17MontaVistaなのですが、

Linuxだという事はわかりましたが、ディストリビューションの名前やバージョンが書かれてません。
今回の件についていえば、カーネルバージョンはあまり依存性がないかと思います。


No6お礼:> ps aux | grep inetdで確認するとxinetdの方が開始されているのですが、
No6お礼:> 「/etc/xinetd.d/rlogin」が存在しません。。。
No6お礼:> (本来なら上記のファイルの設定が必要だと思うのですが、、、)

rlogindじゃなくてrshdではないのかな。


No6お礼:> それで質問なのですが、winXPのコマンドプロンプトのrshは成功するのですが、win7のsuaのrshでは失敗します。
No6お礼:> 同じrshでも何か違うのでしょうか?

お書きになている情報のみから何がとはいえませんが。
例えば、winXPではパケットフィルタでrshコマンドで使うポートを遮断してないけどwin7 sua環境では遮断しているという可能性もありますし。
ただ、winXPのコマンドプロンプトからだとrshが使えるなら、winXPとwin7 suaでの違いを見るのも調査方法の一つですね。

パケットモニタでrsh時のパケットを確認すれば解決への情報が得られるかも知れません。

winXPから使えるなら、問題はunix側の設定でなくwin7という可能性が高そうにも感じました。
パケットフィルタの設定で遮断したパケットはログ出力するよう設定していれば、パケットフィルタのログ見ればわかるかも知れませんね。

No6です。

No6:> unixサーバってなんでしょうか。
No6:> どのunixサーバでも同じではない部分に見えますが。

No6補足:> /etc/pam.d/の設定見直しました。
No6補足:> 設定できていなかったので設定してみたのですが
No6補足:> 結果は同じでした。。。

pamの設定を行なって変わらなかったとしたら、pamを使ってないか新たに行なったpamの設定が正しくないか。

No6お礼:> unix(B)はLinux version 2.4.17MontaVistaなのですが、

Linuxだという事はわかりましたが、ディストリビューションの名前やバージョンが...続きを読む


人気Q&Aランキング

おすすめ情報