メインコンテンツまでスキップ

ユーザー管理に関するLinuxコマンド

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

最近ファイルやディレクトリのパーミッション設定と合わせてよく使っているコマンドなので、備忘録を兼ねて使用例を書き出してみます。 ./app ディレクトリを someuser ユーザー、 apache グループに変更する。

# chown -R someuser:apache ./app

ユーザーのファイルやディレクトリ所有者がひょんなことから root に変わってしまったとき、例えば、スーパーユーザで一般ユーザのファイルやディレクトリを操作した場合等、に設定しなおす際は以下のように。

# chown -R hoge:hoge ./hoge

apache ユーザを nagios グループに所属させる。

# usermod -G nagios apache

Python: ファイル、ディレクトリの属性確認(存在、読み込み、書き込み、実行)

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

$ python
>>> import os
>>> os.access('/root', os.F_OK)
True
>>> os.access('/root', os.R_OK)
False
>>> os.access('/home', os.R_OK)
True
>>> os.access('/root', os.W_OK)
False
>>> os.access('/root', os.X_OK)
False
>>> exit()
$

os.access()の第1引数には調べるパスを指定し、第2引数には調べる内容を指定します。

第2引数調べる内容
os.F_OK存在するか?
os.R_OK読み込めるか?
os.W_OK書き込めるか?
os.X_OK実行可能か?

上の例は、一般ユーザで実行しているため、/rootの読み書きはできないことを示しています。

リファレンス

sshdのログファイルの確認方法

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

サーバーでsshdサービスを使っていると、招かれざる人(大抵bot)も相応の頻度でアクセスしてくる。何時何処からどのようなアクセスがあるのかを把握する為にログファイルを確認することは大事。

sshd のログファイルのパスはCentOS / Fedora系ではデフォルトでは /var/log/secure となる。。

# cat /var/log/secure

尚、ssh のログインに失敗/成功したユーザ数は以下の様なコマンド等でカウントできる。

# grep -c invalid /var/log/secure
# grep -c Failed /var/log/secure
# grep -c Accepted /var/log/secure

Magic Workstation にインポートするオリジナルカードの作成スクリプト

· 約6分
Yu Sasaki
Enterprise Security Manager / Advisor

Magic Workstation(MWS)という対戦カードゲームMagic: The Gatheringが出来るソフトがありますが、その機能の一つにオリジナルカードのインポート機能があります。カードの作成方法はテキストファイルに規定の書式で書いていけばいいのですが、自動化できるところがありましたので、即席ですがスクリプトを書いてみました。

SpoilerMaker.py

Python: 可変個の引数を受け取る関数

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

# 可変個の引数を受け取る関数 # 引数の前に*を付けると、関数内ではタプルとして受け取る def sigma_sq(*nums): # Σf(k)^xのを計算、f(n)はnumsの要素 print (type(nums), nums) x = 2 # 乗数 n_elem = len(nums) # タプルの長さ sum = 0 for elem in nums: sum += pow(elem, x) # x乗する return sum

print(sigma_sq(1, 2, 3)) # 関数呼び出し側の引数: リスト[タプル]の前に*を付けると # 関数側でリスト[タプル]を展開し、個々の要素を埋め込んでくれる list = [1, 2, 3] print(sigma_sq(*list)) print(sigma_sq(*[x for x in range(4)])) def plusx3(a, b, c): return a+b+c print ('n', plusx3(*list)) # 補足: 上の処理を簡潔に書く sq = 2 print ('n', sum([pow(x, sq) for x in list]))

実行結果

(1, 2, 3)
14
(1, 2, 3)
14
(0, 1, 2, 3)
14
n 6
n 14

チュートリアル

Python: CSVファイルに書き込み - csv.writerオブジェクト

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

試しにチャット履歴をCSVファイルに保存するという場合の例を取り上げます。まぁ実際はメッセンジャーアプリのXMLファイル等をコンバートして保存する例を持ってきた方が良いのかもしれませんが、そうするとコードが長くなり今記事の焦点が合わなくなるので割愛します。

ソースコード

#!/usr/bin/python
# coding: UTF-8
# CSVファイルに書き込み
import csv # CSVファイルを扱うためのモジュールのインポート
filename = "table02.csv"
writecsv = csv.writer(file(filename, 'w'), lineterminator='n') # 書き込みファイルの設定
writecsv.writerow(['2007/11/12 20:19:18', 'や、こんばんは。']) # 1行(リスト)の書き込み
writecsv.writerow(['2007/11/12 20:19:39', 'おいーす'])
writecsv.writerow(['2007/11/12 20:19:53', '久しぶりだね'])
writecsv.writerow(['2007/11/12 20:20:02', 'そだね。'])
chatable = [['2007/11/12 20:42:58', 'そうだね'],
['2007/11/12 20:43:03', '色々ありがとう'],
['2007/11/12 20:43:12', 'いえ、こちらこそ。'],
['2007/11/12 20:43:21', 'それじゃあまた'],
['2007/11/12 20:43:27', 'うん、またねー。']]
writecsv.writerows(chatable) # 複数行(リストのリスト|テーブル)の書き込み

実行結果 (table02.csv)

2007/11/12 20:19:18,や、こんばんは。
2007/11/12 20:19:39,おいーす
2007/11/12 20:19:53,久しぶりだね
2007/11/12 20:20:02,そだね。
2007/11/12 20:42:58,そうだね
2007/11/12 20:43:03,色々ありがとう
2007/11/12 20:43:12,いえ、こちらこそ。
2007/11/12 20:43:21,それじゃあまた
2007/11/12 20:43:27,うん、またねー。

リファレンス

Python: CSVファイルの読み込み - csv.readerオブジェクト

· 約1分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

#!/usr/bin/python
# coding: UTF-8
# CSVファイルの読み込み
import csv
filename = "table01.csv"
csvfile = open(filename)
print csvfile
for row in csv.reader(csvfile):
print row # 1行のリスト
for elem in row:
print elem, # 行の中の要素
print
csvfile.close()
print csvfile

CSVファイル (table01.csv) (番号,名前)

1,aki
2,hiro
3,norika
4,kaede

実行結果

<open file 'table01.csv', mode 'r' at 0x01BECCC8>
['1', 'aki']
1 aki
['2', 'hiro']
2 hiro
['3', 'norika']
3 norika
['4', 'kaede']
4 kaede
<closed file 'table01.csv', mode 'r' at 0x01BECCC8>

リファレンス

Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

リスト内包表記を知ることでコードのリーディングとライティングを早めることが出来ます(パフォーマンスもfor文より良いです)。そこでリスト内包表記とfor文の書き換え方を以下に紹介。

ソースコード

#!/usr/bin/python
# coding: UTF-8
# リスト内包表記(リストコンプリヘンション)をfor文に書き換える
# List Comprehensions
print [a for a in range(10)]
# 0~9の数値を要素とするリスト
a2 = []
for i in range(10):
a2.append(i)
print a2
print [b*2 for b in range(10)] # ループのパラメータに演算を行う
# 0~9の数値の×2の結果を要素とするリスト
b2 = []
for i in range(10):
b2.append(i*2)
print b2
print [c for c in range(10) if c % 2 == 1] # 条件を指定してリストを生成
# in の被演算子を評価後、取り出された要素cをif文にかける。if文が偽のときは、とばして次のループに入る
# 結果として、0~9の数値の中で条件「c % 2 == 1」を満たす、すなわち奇数を要素とするリスト
c2 = []
for i in range(10):
if (i % 2 == 1):
c2.append(i)
print c2
print '\n', b2
print [d+1 for d in b2]
d2 = []
for i in b2:
d2.append(i+1)
print d2
e = 'It is important to set my aims but at the same time I should confirm my present condition.'
print '\n', e
print [wd for wd in e.split(' ')]
e2 = []
for i in e.split(' '):
e2.append(i)
print e2

実行結果

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
It is important to set my aims but at the same time I should confirm my present condition.
['It', 'is', 'important', 'to', 'set', 'my', 'aims', 'but', 'at', 'the', 'same', 'time', 'I', 'should', 'confirm', 'my', 'present', 'condition.']
['It', 'is', 'important', 'to', 'set', 'my', 'aims', 'but', 'at', 'the', 'same', 'time', 'I', 'should', 'confirm', 'my', 'present', 'condition.']

一般化

[新しいリストに格納する要素(*1) for OLD_ELEMENT in OLD_LIST if 条件式] *1: 式を書く

追記(2008-6-17): 文字列の1文字ごとの処理

>>> str = 'hello! hello!'
>>> ' '.join([c.upper() for c in str])
'H E L L O ! H E L L O !'
>>>

ここでの処理内容は、upper()メソッドによる英小文字→大文字の変換です。

チュートリアル

Python: lxmlのインストール方法

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

lxml とはXMLやHTMLを扱うPythonのライブラリの一つです。

lxml is the most feature-rich and easy-to-use library for working with XML and HTML in the Python language. - lxmlの冒頭の文より

linux系OS(Fedoraなど)の場合

# yum python-lxml

も一つの手ですがバージョンが古いので、通常はeasy_install経由でlxmlをインストールします。 前段階として、easy_installをインストールするためにhttp://peak.telecommunity.com/dist/ez\_setup.pyをダウンロードしてスーパーユーザで実行します。

# python ez_setup.py error: invalid Python installation: unable to open /usr/lib/python2.5/config/Makefile (No such file or directory)

上のようなエラーがでた場合はpython-develをインストールします。また、合わせてlxmlに必要なパッケージもインストールするには以下のようなコマンドを実行します。

# yum install python-devel libxml2* libxslt*

改めて、

# python ez_setup.py

完了後、easy_installコマンドが実行できるようになります。 lxmlのインストールは以下のコマンドを実行すればOKです。

# easy_install lxml

ライブラリの確認方法は、

$ python
>>> import lxml
>>>

でエラーが出なければOKです。

アンインストール方法

以下のコマンドを実行。

# easy_install -mxN lxml

Windowsの場合

Webアプリのデプロイ環境はLinux系だけれど、開発やテストの一部はWindows機で行いたいのでWindowsにeasy_installでインストールしようとしましたが、途中でエラーが出て中々上手くいきませんでした。 解決に時間が掛かりそうだったので、とりあえずPython Package Index : lxml 1.3.4のlxml-1.3.4.win32-py2.5.exeをダウンロード&インストールして済ませました。

参考にした記事