こんにちは
今、visualC++でプログラムを作っています。
内容はsystem関数を使ってバッチファイルを呼び出すプログラムなのですが
int main(void){
system(tel.bat);

return 0;
}
バッチファイルの内容は

(1)telnet 192.168.○○○
(2)cd フォルダA
(3)test.exe

です。
作って実行してみると(1)の接続はできました。ですがその次の(2)、(3)は実行されませんでした。
どうしたらできるのでしょうか?できればtelnetで実行できるようにしたいです。
           
   操作側   接続先
OS:windows7、windowsCE

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

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

A 回答 (1件)

>バッチファイルの内容は


>(1)telnet 192.168.○○○
>(2)cd フォルダA
>(3)test.exe
>です。
>作って実行してみると(1)の接続はできました。ですがその次の(2)、(3)は実行されませんでした。

telnetコマンドが終了するまで、バッチファイルは次の処理に進みません。
サーバ側から切断させればtelnetコマンドが終了しますので、次の行のcdコマンド、およびtest.exeが『クライアントのローカル環境で』実行されます。
そういうバッチファイルになっています。

希望する動作は、telnetで接続して、サーバ側でディレクトリ移動とtest.exeを実行したいのではないですか?
telnetコマンドの標準入力に流し込めば動くかと思われますが…
# ただし、試したコトはありません。

バッチファイルではなく、CreateProcess()でプロセス起動して、標準入出力のパイプで操作する。
という方法もあります。
「CreateProcess パイプ」辺りで検索すると見つかるでしょう。

http://www.fpcu.jp/dosvcmd/bbs/log/cat1/4-0451.h …
こんなネタもあります。

他の方法としては…希望する処理を記述したTeraTermマクロを作成して、system()でそのマクロを実行する。
とかですかね。
たぶんこっちの方が簡単でしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
telnetコマンドが終了するまで次の命令に移らないんですね。
勉強になりました。
アドバイスしてくださったのを試してみます。ありがとうございました

お礼日時:2010/12/28 14:18

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qtelnetで接続した先のコマンドのバッチファイルを作成したい

毎回動作確認のため、
1、クライアントPCからサーバへtelnetで接続して、
2、接続後、ログイン、動作確認のコマンドを打ちます。

毎回同じコマンドを打つので、
バッチファイルで対応しようかと思いますが可能でしょうか。
それとも他の別の方法がありますでしょうか。
宜しくお願いします。

1のバッチファイル
telnet 192.168.0.2

2のバッチファイル
(192.168.0.2のログインユーザ名)
(パスワード)
(動作確認のコマンド)…


のようなイメージかなぁと考えています。
よろしくおねがいします。

Aベストアンサー

以下のサイトは参考になりませんか?。
http://www.fpcu.jp/dosvcmd/bbs/log/cat1/4-0451.html

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qwindowsからtelnetでログインし自動処理

windowsからUNIXサーバーへtelnetでログインし
その後、様々な処理を行い、ログアウトするまでの一連の操作をバッチファイル化したいのですが、上手くログインできません。

WINODWSで telnet.batというバッチファイルをダブルクリックするとその中の
telnet
open
192.168.1.1
user
passwd
cd usr
cp a.tar b tar
exit
といった処理を実行させたいのですが、
TELNETを呼び出したまでは良かったのですが、
上手くログインできず止っています。
宜しくお願いします。

Aベストアンサー

TeraTermが、あんまり気に入らないとなると、

1) Expectを使う。
http://www-6.ibm.com/jp/developerworks/linux/020614/j_l-sc1.html
2) perlのNet::Telnetを使う。
man Net::Telnet
3) sshでパスワードなしの鍵を使って、コマンドを実行。
man ssh
4) CGI経由でコマンドをキック。

――とか。
expect、sshはcygwinのものが、PerlはActivePerlが使えます。
sshはサーバー側でsshdが動いている必要があります。
CGIは、大抵、管理権限の無いユーザーで動いてますので、setuidする必要があるかも。

Qbatファイルでtelnetを起動⇒文字コードをセット⇒ログイン としたいです。

XPで、Red Hat Linuxサーバにtelnetログインをしています。

C:\WINDOWS\system32\telnet.exeのショートカットをデスクトップに作成し、
1.telnet.exeのショートカットをダブルクリック
2.set CODESET Japanese EUC を設定(文字化けを防ぐため)
3.open 192.168.xx.xx

として、ログインしているのですが、batファイル化したいです。
login.batを作成し、
 telnet 192.168.xx.xx
 pause
と二行だけ記入しておき、login.batをダブルクリックすると、
 Red Hat Linux ...
 Kernel ....
 login:
と表示され、ユーザー名とパスワードでログインできるのですが、
set CODESET Japanese EUC
を設定してからログインするようにするやり方がわかりません。。

リダイレクトやパイプなども調べてみていろいろ試したのですが、できませんでした。

どなたがms-dosに詳しい方、ご教授お願いいたします。

※後学のために、もし、ユーザー名、パスワードもbatファイルに含めることができるのでしたら、その方法も知りたいです。

※イントラの閉鎖されたネットワークで座席fixでの研修作業なので、sshでないtelnetはやめようとか、batファイルにパスワードまで記述してしまうのは脆弱すぎるとかのご指摘は申し訳ありませんがご遠慮願います。

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

XPで、Red Hat Linuxサーバにtelnetログインをしています。

C:\WINDOWS\system32\telnet.exeのショートカットをデスクトップに作成し、
1.telnet.exeのショートカットをダブルクリック
2.set CODESET Japanese EUC を設定(文字化けを防ぐため)
3.open 192.168.xx.xx

として、ログインしているのですが、batファイル化したいです。
login.batを作成し、
 telnet 192.168.xx.xx
 pause
と二行だけ記入しておき、login.batをダブルクリックすると、
 Red Hat Linux ...
 Kernel ....
 login:
...続きを読む

Aベストアンサー

SendKeysを用いた方法が下記ページに^^;
http://www.fpcu.jp/dosvcmd/bbs/log/cat1/4-0451.html
けど、使い勝手を考えると・・・

Poderosaで接続ショートカットを保存する方法はどうでしょうか?
http://ja.poderosa.org/
接続するたびにパスフレーズを入力するのが面倒です
http://ja.poderosa.org/faq/15.html

Qc#でコマンドプロンプトを実行する方法

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
 ※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。

現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。

ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。


---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutput.htmlのコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();

//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)


//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";


//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();

//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコー...続きを読む

Aベストアンサー

>うまくいきません。

「なにが」「どう」「いまくいかない」んでしょうか?

プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?

参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)

cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。

Qtelnet使用時に求められる、loginとpasswordについて

現在DOSプロンプトの勉強をしている
yukidesuyoと申します。
質問ですが、
自宅LANのパソコンにtelnetで接続しようとしたところ、
loginとpasswordを入力しても入れず困っています。
ユーザアカウントの名前とパスワードを入力すると
入れるのかなと思い、入力してもpasswordがはじかれます。
ここに入力するloginとpasswordとは何ですか?
返答のほどよろしくお願いします。

Aベストアンサー

yuubouです。 こんばんわ。

あれこれ情報を集めて会社のPCで実験したところ、それらしき結論が得られ
ましたので試して下さい。

(1)[コントロール パネル] で、[管理ツール] をダブルクリックします。

(2)[ローカル セキュリティ ポリシー] をクリックします。

(3)「セキュリティの設定」
     ↓
 「ローカル ポリシー」
     ↓
 「セキュリティ オプション」
     ↓
 「ネットワーク アクセス: ローカル アカウントの共有とセキュリティ モデル」
 ポリシーを見つけます。
     ↓
 「このポリシーを右クリックし、[プロパティ] をクリックします」
     ↓
 ボックスの [クラシック - ローカル ユーザーがローカル ユーザーとして認証する]
  をクリックします。
     ↓
 [OK] をクリックします。

この設定をした後、telnet serverを再立ち上げして試してみて下さい。

原因は、WindowsXPのセキュリティポリシーでは、Administrator権限を
付与されたユーザでも、ネット接続で入るときは「強制的にGuestユーザとして扱う」
と言う、デフォルト設定にあるようです。
これは「WindowsXPの仕様」なのだそうですが、Windows2000と比べると
かなりガードが堅くなっているようです。

情報源は下記URLにありましたので、参考にして下さい。

参考URL:http://support.microsoft.com/default.aspx?scid=kb;ja;298060

yuubouです。 こんばんわ。

あれこれ情報を集めて会社のPCで実験したところ、それらしき結論が得られ
ましたので試して下さい。

(1)[コントロール パネル] で、[管理ツール] をダブルクリックします。

(2)[ローカル セキュリティ ポリシー] をクリックします。

(3)「セキュリティの設定」
     ↓
 「ローカル ポリシー」
     ↓
 「セキュリティ オプション」
     ↓
 「ネットワーク アクセス: ローカル アカウントの共有とセキュリティ モデル」
 ポリシーを見つけま...続きを読む

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

こんにちは。

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

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

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

Aベストアンサー

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

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

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

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

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

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

QC#で開発できるかどうか教えてください part1

開発言語として、C#を選択し、GUIを作成しようと考えています。

ネットで検索しているとC#は'windows'向けというキーワードがたくさん

みうけられるため、これからお話しする条件を満たすことが出来るのか

知りたくてご質問させていただきたく。


まず画面のレイアウト的な部分は抜きにして、ボタンを押した後の

処理について。


'linux'上であるスクリプトを作成しておき、そのスクリプトが一連の処理を

'linux'上でするとしてます。実行方法として、

スクリプトファイル名 引数1 引数2

である処理が流れるとします。


C#のGUIで、引数1 引数2を入力し、ボタンを押した瞬間に

'linux'のスクリプト処理が始まることを実現したいのですが

できるのでしょうか?

C#はwindows系ということからlinuxに連動させることができるのか

どうも引っかかるのです。

よろしくおねがいいたします。

Aベストアンサー

私は、以前C#の練習にGUIで動かすチャットをつくったことがあります。
その時はサーバー側にphpでwebapiをつくってそれを
C#側でHTTPリクエストでたたいてサーバー側のスクリプトを実行させてました。

私はPHPでつくりましたが、php側にLINUX上で操作させたいナーバスな処理を書く感じでしょうか。
このやり方が一番シンプルな気がします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報