2012年6月27日水曜日

[PowerShell] 拡張子を見て整理してくれるロボット

PowerShellで簡単なプログラムを書いてみました。
簡単なと言っても自分にとってはわりと難しくて 4時間くらいかかっちゃいましたが…
 Windows7にある「ダウンロード」フォルダ内に散らばってる
色んなお宝を拡張子で分けて拡張子フォルダを作って
そこに片付けてくれます。


#-----------------------------------------------------------
#ガシャーン。拡張子判断ロボだよ。
#拡張子の名前でフォルダを作って放り込むすごいやつだよ
#-----------------------------------------------------------

#-----------------------------------------------------------
#フォルダ作成関数
#-----------------------------------------------------------
Function Create-Folder( $folderName )
{
 if(Test-Path $folderName)
 {
 }
 else
 {
  $currentDirectory = Get-Location
  $createLocation = "$currentDirectory\$folderName"
  New-Item -type directory $createLocation
 }
}

#-----------------------------------------------------------
#Main的な
#-----------------------------------------------------------
#PowerShellの実行権限を一時的にRestrictedまで拡大し実行可能にする
$myPolicy = Get-ExecutionPolicy
if( $myPolicy -ne "Unrestricted" )
{
 set-executionpolicy Unrestricted
}

#実行しているユーザ名を取得し、それを利用して「ダウンロード」フォルダへ移動する。
$targetDirectory = "C:\Users\" + $env:username + "\Downloads\"
cd $targetDirectory

#「ダウンロード」フォルダ内のすべてのファイルを配列として変数に格納
$downloadItems = Get-ChildItem

Foreach( $aItem in $downloadItems )
{
 #フォルダ/ファイル判定
 if ( $aItem.PSIsContainer )
 {
  Write-Host "フォルダ: " -NoNewLine
  write-host "$aItem - フォルダなので無視します。"
 }
 else
 {
  Write-Host "ファイル: " -NoNewLine
  write-host $aItem.PSChildName
  #ファイルなら拡張子の文字数を確認
  [string]$itemName = $aItem.PSChildName
  $intNuberOfKakutyousi = $itemName.length - $itemName.LastIndexOfany(".") - 1
  $kakutyousi = $itemName.substring( $itemName.length - $intNuberOfKakutyousi )
  Create-Folder($kakutyousi)
  Move-Item $aItem $kakutyousi
 }
}

#ExecutionPolicyをもとに戻す
if( $myPolicy -ne "Unrestricted" )
{
 Set-ExecutionPolicy $myPolicy
}


ていうかさ、このコードを色分けしてくれる機能すごいね。
 ここを参考にさせていただきました。 PowerShell自体は、
PowerShell基礎文法最速マスター と、TechNetのコマンドレット一覧と、
あとVBScript使ったことある人ならここもすごく役に立ちます。

 ひとまずブログに書けた。 ホントはGitの練習してGithubにアップしたい。



2012年6月9日土曜日

[Linux] VPSのrootユーザのパスワード忘れた


久しぶりにおうちでカタカタやったらいろいろひどかった…

・VPSにroot以外のユーザ作ってなかった。
・そしてrootのパスワード忘れた
・だから何もできなくなり、VPSのOS再インストール
・Botが載ってたけどいろいろデグレード
・なんとか復活したけど自動リプライ機能を失った
・なんでソースコード取ってないの俺…

ということで、Linuxの基本的な設定をいくつかやりました。
知識としてはだいぶ初級編。
でもコマンドでアカウント作成とか初めてやった…。


■Linuxに新規ユーザを追加
useraddコマンド
(参考)
http://kazmax.zpp.jp/linux_beginner/useradd.html

何かを作成するときはたいていコマンドでパパっとやっちゃう方法と
対話(Windowsならウィザード)でひとつひとつ入力していく方法が
あると思います。対話式だと多少めんどくさいけど、
意識しなきゃいけない設定はたいてい入力を促されるので便利。

今回はコマンド1行でアカウントを作成。しかしそのかわりに
ユーザに関する設定はほとんど行わず…そういう場合どうなるのか?
デフォルト値ですね。入力しなかった設定に関してはデフォルトの設定が
適用されて、それで勝手に作成される。
Linuxユーザ新規作成のデフォルト設定の確認は「useradd -D」コマンド。

CentOS release 6.2 (Final) x86_64 の場合の
デフォルトの設定はこうだった。
------------------------------
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
------------------------------

各設定の意味は上記の(参考)のページを確認してみましょう。
もっと勉強してbash以外のShellがイイ!とか言ってみたいなぁ…。
/etc/skel は覚えておくと便利かも。ユーザプロファイルのスケルトン
(ひな形)です。業務で間違ってrootユーザのプロファイル消しちゃって
上司からここ使えって教えてもらったことがあります…w


■新規作成したユーザに対するパスワードの作成
で、useraddコマンドで作成した
useraddコマンドで追加したユーザはパスワードを持っていないため
passwdコマンドでパスワードを作成する
http://www.geocities.jp/a1770053/jyoho/scsa/chapter6.htm
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230854/


■rootでのログインを禁止する
http://wiki.minaco.net/index.php?Linux%2Froot%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%A6%81%E6%AD%A2
WindowsのAdministratorやLinuxのrootはユーザ名がわかってるから、
それだけでもう大きなセキュリティリスクとなります。
どこのおうちにいってもAdministratorはAdministratorだもんね。
なので、ログオンできなくしてしまいましょう。
/etc/ssh/sshd_config をエディタで開いて
「PermitRootLogin no」という行を追加してあげればいいみたいですね。
デフォルトだとyesにはなっているものの、
#PermitRootLogin yes とコメントアウトされているから、
何も書かなければログオンできる、ということなのでしょう。
#を外してyesをnoに変えるのでもいいですが、
私はすぐ下の行に「PermitRootLogin no」を書いてやる
書き方の方が好きです。そのへんは好みで済ませていいのかな?
こういうタイプの人が業務用プログラムを改修したときに前のコードを
コメントアウトして残してたりするのかな?まぁいっか。


■Botのデグレードした機能「定期Post」を復活させる
1時間に1回つぶやいていたので、それを復活させる。
cron.dに自分のBot用のcronファイルを作成し、そこにコマンドを書いてあげる
cronファイルの書き方は以下がわかりやすい。
http://www.server-memo.net/tips/crontab.html

適当な名前のCronが書かれているファイル…
、たとえば「CronOfBot」とかを作って、それをOSが決めている
「お前がつくった『ぼくのかんがえたさいきょうCron』はここに置け」
っていう場所に置いてあげる。
場所はCentOSの場合 /etc/cron.d/ の中。
覚えておくと便利なんだけど、CronでもApacheのモジュール用設定ファイルでも、
「おまえが作った『ぼくのさいきょう○○』はここに置け」っていうディレクトリ名は
○○.dってなっている。


■ファイルやディレクトリの所有者を変更
ファイルやディレクトリの所有者を変えるだけなら chown コマンドでおk。
その所有者に代行してもらうなら su コマンドでそのユーザになるか、
sudoコマンドで「管理者権限で実行」する。
sudoコマンドを使えるようにするには設定ファイルの編集が必要。

普段の作業用アカウントを作って、そいつでcronファイルを書いたまではいいが、
作ったcronファイルが/etc/cron.d/ディレクトリ内へコピーできない。
それは/etc/cron.d/ディレクトリの所有者がrootになっていて、
自分じゃコピーさせてもらえないから。
そういう場合の選択肢は3つ。
    1.諦める
    2.そのディレクトリの所有者に代わりにコピーしてもらう
    3.自分がそのディレクトリの所有者になる。

2.か3.を行うわけだけど、今回の場合は2.のほうがいいですよね。
/etc以下のディレクトリはWindowsでいえば「C:\Windows」みたいな
システム用の場所なので1ユーザの所有物にしちゃ(きっと)ダメです。

ということでsuコマンドでrootになってコピーしました。
あ、「su -」したほうがいいんだっけ…?あとで調べる。

で、いままで知らなかったんですけど、sudoコマンドには設定ファイルがあって、
そこをへんこうしてやらないと新しく作ったユーザはsudoできないんですよ。
/etc/sudoers っていうファイルを編集するんだけど、
visudo っていう専用コマンドで編集する。crontabみたいな。
下のページにものすごく詳しく書かれていて、とても参考になります。
http://linux.kororo.jp/cont/intro/sudo.php

こんなページを書ける人はすごいな…

で、なにすればいいかというと、自分がsudoしたいユーザを
追記してあげればいいです。

適当なところ…たとえばざっとファイルを見てみるとこういう場所がありました。

------------------------------
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
------------------------------

ここにこんな感じで追記してみました。
------------------------------
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
%Ore        ALL=(ALL)       ALL
------------------------------

そしたら俺(Ore)はsudoできるようになりました。
でもぶっちゃけこれでいい気がする。
------------------------------
## Allows people in group wheel to run all commands
%wheel        ALL=(ALL)       ALL
------------------------------

ユーザがWheelグループに入ってればだけど。


あー、スキルが足りない。
設定周りでやるべきこと他にありましたらぜひ教えて下さい!