ラベル DOS の投稿を表示しています。 すべての投稿を表示
ラベル DOS の投稿を表示しています。 すべての投稿を表示

2009年3月4日水曜日

コマンドプロンプトはタイトルつけとくといいよ

Windows使っているならコマンドプロンプト使うよね?
OKわかった、"title" コマンドを使うべきだ。
 
 

要はいくつか開いたコマンドプロンプトのウインドウを区別つくようにしておこうという趣旨。
"title" コマンドはタイトルバーの文字を変えてくれる、例えばL2スイッチに telnet する前に "title L2" としてみよう。

[caption id="attachment_1261" align="alignnone" width="677" caption="画像:titleコマンド結果"]画像:titleコマンド結果[/caption]
 

タイトルバーが変わったのが分かるはず。Vistaだと、「管理者:」 ってのが固定だから少々じゃまだが、XPだとすっきりしているはずだ。
 

これはタスクバーにコマンドプロンプトを並べたとき特に威力を発揮する。

[caption id="attachment_1262" align="alignnone" width="148" caption="画像:タスクバー"]画像:タスクバー[/caption]
※ 追記:タスクバーを右にして使っています。
 

それぞれのウインドウでやってることがわかる、これは作業効率に地味に効いてくるので癖をつけたほうがいいと思う。
「Windows+Rキー → cmd → title hogehoge」 という流れを意識しよう。
 

2008年12月4日木曜日

MS-DOSバッチファイルでFizzBuzz

昨日の記事:VBScript で FizzBuzz の続編。
FizzBuzz、今度はDOSバッチファイルで作ってみた。
単純にやってみたかっただけなので、コードを短くする工夫とかはまあ置いておこう。
 
 

FizzBuzzをDOSバッチでやる際に、とりあえず剰余(mod)が取れるのかよく分からなかったので3の倍数、5の倍数を判断するカウンタをつくることにして書いてみた。
記事書く前に、本で算術演算子を調べたら、mod 取れるみたい…
100を3で割った余りなら、
> set /a hoge=100%3
でOKだった。まぁコレはコレでありかな。。

 

ちょっと引っかかったのが遅延展開、forの中で普通に変数 %hoge% って使うと、forの中でいくら中身をいじろうと、for に入る前の変数の中身が展開されちゃう。
setlocalで 遅延展開有効 にして、!hoge! って使えばfor内でもその時点の変数内容が展開される。
あとは特に工夫も無く。
[sourcecode language='sh']
@echo off

REM // 遅延展開有効
setlocal enabledelayedexpansion

REM // ウインドウタイトル変更
TITLE FizzBuzz

REM // カウントダウン用の変数
set SAN=3
set GO=5

REM // 繰り返し
for /l %%I in (1,1,100) do (

rem // 表示用の変数、空っぽ比較用も
set STRING=
set STRING_FLG=

rem // 3と5のカウンターが0ならリセット
if !SAN!==0 (set SAN=3)
if !GO!==0 (set GO=5)

rem // 3と5のカウンターを一つ減らす
set /a SAN=!SAN!-1
set /a GO=!GO!-1

rem // 3のカウンターが0なら表示用にFizz追加
if !SAN!==0 (set STRING=Fizz)

rem // 5のカウンターが0なら表示用にBuzz追加
if !GO!==0 (set STRING=!string!Buzz)

rem // ここでFizzもBuzzも入ってなければループ数字追加
if !STRING!==!STRING_FLG! (set STRING=!STRING!%%I)

rem // 現在の数と、FizzBuzzの結果を出力
echo %%I !STRING!
)
pause
endlocal
[/sourcecode]


実行結果。
[caption id="attachment_1099" align="alignnone" width="428" caption="画像:FizzBuzz"]画像:FizzBuzz[/caption]
 

デキター。
 

剰余の計算処理もちゃんと調べてればもう少しスマートだったが、まあ結果オーライという事にしよう。
set のヘルプに一応ヒントらしきものはあったが見逃した。
setの詳しい解説があった。

2008年12月1日月曜日

clip.exe でコマンドプロンプトの出力をクリップボードに送る@WindowsServer

サーバで作業中によく使うコマンド、「clip.exe」について。WindowsServer2003以降(vista含む)は標準で利用できる。
 
 

コマンドプロンプトで作業中に、長い出力結果をゆっくり見たいことがある。ファイルにリダイレクトして開いても良いが、パイプを利用して clip.exe に渡すと手間が省ける。
 

例えば for コマンドのヘルプ、コレはやたらと長くて 実に142行にわたる。
これをコマンドプロンプトのウィンドウを遡って読むのは非常に疲れるので、クリップボードに送ってメモ帳などに貼り付ける。
> for /? | clip

 

で、メモ帳にぺたっと。
[caption id="attachment_1088" align="alignnone" width="500" caption="画像:クリップボードからメモ帳へ"]画像:クリップボードからメモ帳へ[/caption]
 

これでゆっくり読める。

2008年11月5日水曜日

plink.exe pscp.exe で Windowsコマンドラインからssh、scp

Windowsコマンドプロンプトから急にLinuxサーバにファイルの転送がしたくなった。
同様に、突然ssh経由でログインしたくなった。
 

そんな機会もあろうかと、有名なsshクライアントのputtyにはおまけが付いている。
plink.exe , pscp.exe がそれだ。単純にコマンドラインから ssh/scp がやりたければ十分なツールだ。
 

たまに使うので記事にしておく、適当なところに設置してパスを通しておくと便利かも。
 
 

sshクライアント plink.exe (PuTTY Link)


大まかな使い方は ssh コマンドと一緒。ヘルプを載せておく。
機能はイマイチ、Screen などのユーティリティもh上に変な動きになるが、動作確認程度として考えたら十分だ。コマンド叩いてくるだけのような使い方でもよい。
※機能十分なクライアントが使いたければ putty.exe を叩けばいい。
 
PuTTY Link: command-line connection utility
Release 0.60
Usage: plink [options] [user@]host [command]
("host" can also be a PuTTY saved session name)
Options:
-V print version information and exit
-pgpfp print PGP key fingerprints and exit
-v show verbose messages
-load sessname Load settings from saved session
-ssh -telnet -rlogin -raw
force use of a particular protocol
-P port connect to specified port
-l user connect with specified username
-batch disable all interactive prompts
The following options only apply to SSH connections:
-pw passw login with specified password
-D [listen-IP:]listen-port
Dynamic SOCKS-based port forwarding
-L [listen-IP:]listen-port:host:port
Forward local port to remote address
-R [listen-IP:]listen-port:host:port
Forward remote port to local address
-X -x enable / disable X11 forwarding
-A -a enable / disable agent forwarding
-t -T enable / disable pty allocation
-1 -2 force use of particular protocol version
-4 -6 force use of IPv4 or IPv6
-C enable compression
-i key private key file for authentication
-noagent disable use of Pageant
-agent enable use of Pageant
-m file read remote command(s) from file
-s remote command is an SSH subsystem (SSH-2 only)
-N don't start a shell/command (SSH-2 only)
-nc host:port
open tunnel in place of session (SSH-2 only)

 
 

scpクライアント pscp.exe (PuTTY Secure Copy client)


これも scp コマンドと似たような使い勝手。ヘルプのっけるだけでも大体分かるな。
 

PuTTY Secure Copy client
Release 0.60
Usage: pscp [options] [user@]host:source target
pscp [options] source [source...] [user@]host:target
pscp [options] -ls [user@]host:filespec
Options:
-V print version information and exit
-pgpfp print PGP key fingerprints and exit
-p preserve file attributes
-q quiet, don't show statistics
-r copy directories recursively
-v show verbose messages
-load sessname Load settings from saved session
-P port connect to specified port
-l user connect with specified username
-pw passw login with specified password
-1 -2 force use of particular SSH protocol version
-4 -6 force use of IPv4 or IPv6
-C enable compression
-i key private key file for authentication
-noagent disable use of Pageant
-agent enable use of Pageant
-batch disable all interactive prompts
-unsafe allow server-side wildcards (DANGEROUS)
-sftp force use of SFTP protocol
-scp force use of SCP protocol

2008年9月23日火曜日

なんとなくWindowsでC言語プログラミング_(2)

「なんとなくPシリーズ」タグを作って続行。タイトルは 続 → 新 → … と続けたかったがやめておく。
一応コンセプトとしてはC言語を勉強してLinuxカーネルソースに迫ろうとしているのだが、果たして。
 
 

前回のなんとなくWindowsでC言語プログラミングで思い出したものがある。
こんにちはマイコン」、1982年!の本。次は折角なのでそれっぽいことをやってみよう。
変数のお勉強でたしかこんなコード、N-88 Basic だっけ?
10 INPUT "ナマエ ヲ ニュウリョク";A$
20 PRINT A$;"ノ アホー"
(30 goto 20)
※3行目gotoもしたかったけど、今回大分話がそれていくのでパス。
 
キーボードから文字列の入力を促し、変数に代入。それを標準出力から表示する単純なプログラムだ。
これの下りは面白かった記憶がある。
 

ついでなのでbatで再現


[sourcecode language='bash']
@echo off
set /P name="ナマエ ヲ ニュウリョク"
:10
echo %name% ノ アホー
goto 10
[/sourcecode]
簡単だが、やはりこれでは展開がない。
 
 

それではCで再現


main(void)とコメントを覚えた。
[sourcecode language='c']
#include

int main(void) {
char name[8]; /*メモリ8バイト確保!*/
printf("ナマエ ヲ ニュウリョク");
scanf("%s",name); /*入力をnameのポインタのとこに並べる*/
printf("%sノ アホー\n",name); /*nameの中身を出力*/
return 0;
}

[/sourcecode]

収穫は変数の宣言とscanfのおかげでポインタがなんとなく分かった事。

実行してみる。
>inputter.exe
ナマエ ヲ ニュウリョクarashi
arashiノ アホー

上々。
 
char宣言で8バイトメモリを確保、アドレスの情報をポインタとしてnameに格納しているというわけかいな。
 

実験タイム1


ほなここで実験してみよう、変数2つ宣言したら並ぶの?
[sourcecode language='c']
#include

int main(void) {
char name[8]; /*メモリ8バイト確保!*/
char name1[8]; /*同様にname1を宣言する*/
printf("ナマエ ヲ ニュウリョク");
scanf("%s",name);
printf("%sサンハ テンサイ\n",name);
printf("%x\n",&name); /*nameのアドレス*/
printf("%x\n",&name1); /*name1のアドレス*/
return 0;
}

[/sourcecode]


>inputter.exe
ナマエ ヲ ニュウリョクsatoru
satoruサンハ テンサイ
12ff64
12ff6c


えーと、8バイトだからー。 12ff64 から 12ff6b までで8バイト、次は 12ff6c から、、合ってる。並んでるね。
 

実験タイム2


入出力で実験、入力してない変数を出力するとか。
[sourcecode language='c']
#include

int main(void) {
char name[8];
char name1[8];
printf("ナマエ ヲ ニュウリョク");
scanf("%s",name);
printf("%sサンハ テンサイ\n",name);
printf("%sノ アホー\n",name1); /*入力してないname1を出力する*/
return 0;
}
[/sourcecode]

実行する、まずは普通の入力
>inputter.exe
ナマエ ヲ ニュウリョクippata
ippataサンハ テンサイ
3n@ノ アホー

3n@ てなんじゃらほい。確保したメモリに元からあった情報と言うことらしいけど、まあ0で埋めるなりの初期化すれば問題ないことが分かった。
 

でも次の入力。20文字入れてみる。
>inputter.exe
ナマエ ヲ ニュウリョク123456789a123456789b
123456789a123456789bサンハ テンサイ
9a123456789bノ アホー

ああああぁ、は、はみ出したーー
scanf()に脆弱性が、っていうのはテクニカルエンジニアで習ったけどこういうことか、ものすごく納得。
とはいえ、狙ったコードの実行は至難の技にも見えるんだけど、どうなんだろう。なんか手法が確立されてるんだろうか。
 
 

そして脱線へ


これはどうやって動いているんだろうと思ったのでちょっと追う。
WindowsのCコンパイラは "/Fa" というオプションをつけたらアセンブリリストのファイルを作ってくれる。
で、作ってみた。ちょっと省略してこんな感じ。
_main PROC
; File c:\cprog\inputter.c
; Line 3
push ebp
mov ebp, esp
sub esp, 20 ; 00000014H
mov eax, DWORD PTR ___security_cookie
xor eax, ebp
mov DWORD PTR __$ArrayPad$[ebp], eax
; Line 6
push OFFSET $SG2471
call _printf
add esp, 4
; Line 7
lea eax, DWORD PTR _name$[ebp]
push eax
push OFFSET $SG2472
call _scanf
add esp, 8
; Line 8
lea ecx, DWORD PTR _name$[ebp]
push ecx
push OFFSET $SG2473
call _printf
add esp, 8
; Line 9
lea edx, DWORD PTR _name1$[ebp]
push edx
push OFFSET $SG2474
call _printf
add esp, 8
; Line 10
xor eax, eax
; Line 11
mov ecx, DWORD PTR __$ArrayPad$[ebp]
xor ecx, ebp
call @__security_check_cookie@4
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END

 

うーん。。まさにこれは全部書いてあるんだろうけど、次回だな。
 
 

しかし カーネル への道のはずなんだが。。。やっぱり遠回りなのでは。
そうだコンテキストスイッチというのはこれを切り替えているんだろうなと言うことでまとめよう。

2008年7月24日木曜日

WindowsバッチファイルでYYYYMMDD

YYYYMMDD(hhmm)。
バッチファイル内でログファイルを出力するなら「これ+プリフィックス」をファイル名にするのが理想ではないでしょうか。
 
ちょっとバッチファイルで組み立てましょう、下記をテキストファイルに入力して拡張子をbatにします。
@echo off
set tmpDate10=%date:~-10%
set YYYYMMDD=%tmpDate10:/=%
echo %YYYYMMDD%

set tmpTime5=%time:~0,5%
set tmpTime4=%tmpTime5::=%
set HHMM=%tmpTime4: =0%
echo %HHMM%

echo %YYYYMMDD%%HHMM%
pause

 
変数"YYYYMMDD"は年月日、"HHMM"を時分として組み立てています。
実行すると下記、
20080723
2230
200807232230
続行するには何かキーを押してください . . .

この変数を使ってファイル名なり何なりを定義してしまえばいいのですが、
何でこんなにややこしくなってしまうのでしょうか。
一応続きで解説しておきます。