Quantcast
Channel: CentOS –俺的備忘録 〜なんかいろいろ〜
Viewing all 498 articles
Browse latest View live

Python製のシンプルなレインボーテーブル生成ツール『Leprechaun』

$
0
0

ここのところ、ちょっとした対応のためにレインボーテーブルについて調べていたのだが、Python3製のワードリストからレインボーテーブルを生成できる『Leprechaun』なるツールを見かけたので、試しに使ってみることにする。指定したワードリストからハッシュ値を生成できるので、よく利用されるパスワードをワードリストに入れておけば、ランダムな文字列で生成したレインボーテーブルよりも効率よくパスワード解析ができるかもしれない。ワードリストからの生成の他、地味にソルト(前後対応)やストレッチングも指定できるので、結構便利そうだ。
今回はUbuntu Server 16.04 LTS上でテストを行う。

1.インストール

まず、以下のコマンドでインストールを行う。
(pipだとちょっと古いっぽいのでソースからインストール)

sudo apt install git
git clone https://github.com/zcdziura/leprechaun
cd leprechaun
chmod +x setup.py
sudo ./setup.py install

 

これでインストールができた。

 

2.レインボーテーブルの生成

次に、実際にレインボーテーブルの作成を行ってみよう。
以下、コマンドのhelp。

blacknon@BS-PUB-DEVELOP:~$ leprechaun -h
usage: leprechaun [-h] [-f] [-g] [-l WORD_LENGTH] [-o OUTPUT] [-d] [-m] [-s]
                  [-s2] [-s3] [-s5] [-i ITERATIONS] [--prefix PREFIX]
                  [--postfix POSTFIX] [--first-run-only] [--debug]
                  WORDLIST

positional arguments:
  WORDLIST              The file name of the wordlist to hash, without the
                        file extension

optional arguments:
  -h, --help            show this help message and exit

wordlist arguments:
  -f, --wordlist-folder
                        Hash all of the plaintext files in a folder, rather
                        than a single file; the name of the folder will be set
                        by the WORDLIST argument
  -g, --generate-wordlist
                        Generate a wordlist dynamically instead of using a
                        pre-built one; the name of the dynamically generated
                        wordlist will be set by the WORDLIST argument
  -l WORD_LENGTH, --word-length WORD_LENGTH
                        Maximum word length for generated wordlist

output arguments:
  -o OUTPUT, --output OUTPUT
                        The name of the output file (default=rainbow)
  -d, --use-database    Rainbow table will be an sqlite database, not a
                        plaintext file

hashing algorithms:
  -m, --md5             Generate MD5 hashes of given passwords (default)
  -s, --sha1            Generate SHA1 hashes of given passwords
  -s2, --sha256         Generate SHA256 hashes of given passwords
  -s3, --sha384         Generate SHA384 hashes of given passwords
  -s5, --sha512         Generate SHA512 hashes of given passwords

hashing arguments:
  -i ITERATIONS, --iterations ITERATIONS
                        Set the number of hash iterations, default=1
  --prefix PREFIX       Set a prefix for the word
  --postfix POSTFIX     Set a postfix for the word
  --first-run-only      Add the pre/postfixes only during the first iteration,
                        default=False

logging arguments:
  --debug               Print out debug statements

 

それでは、実際にワードリストを読み込ませてレインボーテーブルを作成してみよう。
今回は、以下のようなワードリストを読み込ませてみる。

blacknon@BS-PUB-DEVELOP:~$ cat test_word.list
password
password1
password12
password123
passWord
passWord1
passWord12
passWord123
Password
Password1
Password12
Password123
PassWord
PassWord1
PassWord12
PassWord123

とりあえず、アルゴリズムがmd5やSHA1、SHA256などで設定したレインボーテーブルを以下のように作成してみた。

blacknon@BS-PUB-DEVELOP:~$ # md5
blacknon@BS-PUB-DEVELOP:~$ leprechaun --md5 -o test_rainbow_md5.table test_word.list
Leprechaun started, 07:48:46
Rainbow table has been generated
Leprechaun finished in: 0:00:00.022383.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_md5.table.txt
5f4dcc3b5aa765d61d8327deb882cf99:password
7c6a180b36896a0a8c02787eeafb0e4c:password1
c24a542f884e144451f9063b79e7994e:password12
482c811da5d5b4bc6d497ffa98491e38:password123
9334cf859035e2f0318320ceb88c7e6d:passWord
5896f7b56f5d7f43270cb1bc66bd4d41:passWord1
ab02afc90f2d2fa48a0ab66d0c4d6998:passWord12
e9aad0ee0eb5b38b36d7bb39f49e0c39:passWord123
dc647eb65e6711e155375218212b3964:Password
2ac9cb7dc02b3c0083eb70898e549b63:Password1
08f5b04545cbf7eaa238621b9ab84734:Password12
42f749ade7f9e195bf475f37a44cafcb:Password123
a9d402bfcde5792a8b531b3a82669585:PassWord
f2126d405f46ed603ff5b2950f062c96:PassWord1
bde4c7f50802c53f1825de349a7ce55c:PassWord12
28d2464b121f120a41f4cd5c496cae2c:PassWord123
blacknon@BS-PUB-DEVELOP:~$ # sha1
blacknon@BS-PUB-DEVELOP:~$ leprechaun --sha1 -o test_rainbow_sha1.table test_word.list
Leprechaun started, 07:49:52
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023371.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha1.table.txt
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8:password
e38ad214943daad1d64c102faec29de4afe9da3d:password1
10c28f9cf0668595d45c1090a7b4a2ae98edfa58:password12
cbfdac6008f9cab4083784cbd1874f76618d2a97:password123
f06fec81712821efc805e9c49cf3bfecdcdcaa0c:passWord
fae2a9d752a0062ba905ab896f851f725803d6fd:passWord1
1bb25ce9d081792928f3732103e475d4633f4bb9:passWord12
316ee133b40d3164b5b3f5aeefd22435b125e4b1:passWord123
8be3c943b1609fffbfc51aad666d0a04adf83c9d:Password
70ccd9007338d6d81dd3b6271621b9cf9a97ea00:Password1
67a258218f68f6b5f7142593cf4b1f7d87622dd8:Password12
b2e98ad6f6eb8508dd6a14cfa704bad7f05f6fb1:Password123
f5d8cf270e82cff012babb306319ffa13983a45d:PassWord
285d0c707f9644b75e1a87a62f25d0efb56800f0:PassWord1
0cbdab7ab5b0fa7ed35f51b2352afd9b849acdfc:PassWord12
e02c1eaba7bcf2415bc9c80e1eb0b8611bb50247:PassWord123
blacknon@BS-PUB-DEVELOP:~$ # sha256
blacknon@BS-PUB-DEVELOP:~$ leprechaun --sha256 -o test_rainbow_sha256.table test_word.list
Leprechaun started, 07:50:22
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023703.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha256.table.txt
5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8:password
0b14d501a594442a01c6859541bcb3e8164d183d32937b851835442f69d5c94e:password1
b3d17ebbe4f2b75d27b6309cfaae1487b667301a73951e7d523a039cd2dfe110:password12
ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f:password123
a6f63a5fb10b3bba180a79f2fc565b1db2101040ce71ea80692d671857fe2117:passWord
a9bdcfbc66f41ec7711a11583198cb082801c130b2eca9d799f170f61fa50946:passWord1
bcd6724c7ad9a89d8215a89c3376a3ef119e4b7e9f961cee942fe8cfaf0ff4d6:passWord12
6ea1634442bf3a853f350c0d5612742c99646d8ca922ea942382ba152b51f077:passWord123
e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a:Password
19513fdc9da4fb72a4a05eb66917548d3c90ff94d5419e1f2363eea89dfee1dd:Password1
f3c16dc3ef3ba55671b0ac2938730a4afc3867cf4c01ae9a09cfe4e2367666bd:Password12
008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601:Password123
fa3c600fd798799c9f214813806a51e51b8db790a45dd1285f573890f24a5cfe:PassWord
c04265d72b749debd67451c083785aa572742e3222e86884de16485fa14b55e7:PassWord1
704ff8caa642f5ec2dc6e1ce92438e1b9da83cb820b94514800ad5c43f2c3f10:PassWord12
5649332ac4766c482f458ae0e276d7a5330a1f76816732e7a8c0be9ccdfa2d1a:PassWord123
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_md5_solt.table.txt
e0e47b25e8c67d14c4fa5ed7e006daf1:password
3f25a2fe9f9af157914e743e666ea8a5:password1
c13e86f85c940d10f84967496c5baf32:password12
572f81ddc0f1e2d768654dfe8346cf06:password123
3890bb507801f605e7eb4696c51ff100:passWord
00931f5f7cbcf71239ebe427900bafe3:passWord1
1416d47746ba61c33052e7d51541d721:passWord12
57219546c1fabb25f18a693b6dbef0fb:passWord123
7e07b12def86b4e8be8834c2d5b045f8:Password
a7e0ccb72db37d26a889d77c6f43ee88:Password1
1ee4c328f715ba3d87ca00b2f5daccd9:Password12
c9c35100a6c477fbf663d95ee946482c:Password123
b380211beadb8b8119eec8c0b1ab4a62:PassWord
0768224773e276486813910b95a5398f:PassWord1
3a0cd15809175e88dc3b4da7c9aab226:PassWord12
dceeecf7721c0294ce852797821c52ab:PassWord123
blacknon@BS-PUB-DEVELOP:~$ leprechaun --prefix solt --sha1 -o test_rainbow_sha1_solt.table test
_word.list
Leprechaun started, 07:53:29
Rainbow table has been generated
Leprechaun finished in: 0:00:00.023267.
blacknon@BS-PUB-DEVELOP:~$ cat test_rainbow_sha1_solt.table.txt
30e2c871d7c244659c75af587e5656af11788136:password
6303ed6a0dc6ea2a9c7d3a42a48a1be437b021b5:password1
a775f4d4e316399abd9fb62d1a800f963195699b:password12
761953fee521730db8779bdb7c2c8edaee3da20e:password123
be10b0a7d08eb348c0155e749519d6d9777e9193:passWord
ea7910737554e02fafb3a65d31ae6ccb878a2ce7:passWord1
0859a228fe64d5fe7dd3c3a281151f7a334dc0aa:passWord12
acd057327c7443d5a1d5e9aa799c1c5f41d2ac92:passWord123
c902fadcad050890ba3c21a4097f3371556c665d:Password
c789d822bc19d9f7723715de742bc662fda0f200:Password1
37dcd1c285bbbdb9757470a94de693ad35952461:Password12
855b33a30b73486dfb502e3641e86b56956b2ecd:Password123
5f590b4ed24a0bd30536c6cda03229d64bd02a3f:PassWord
81d10650f0da897859e48de11e91302c410ea938:PassWord1
8fa963c52b4d82057559d1e7654e17d2d1f8e33c:PassWord12
0489cdeb3975e16de2239c7c06e1b90225288ac5:PassWord123

 

後は、コレを加工してハッシュ値と突合させていけばいいということか。平文で出力されるので、数が少なければgrepなりawkでの突合でもそれなりにやれそうだ。
(実際のパスワードだと、ソルトの値はわからないしストレッチングもしているだろうから相応に膨大なレインボーテーブルを生成する必要があると思うが…)

 

パスワード解析 完全版 パスワード解析 完全版

sshの.ssh/configでホスト名と鍵を指定してる際、違う鍵を使って接続するときの注意

$
0
0

先日、ssh接続する際に.ssh/configで指定していた鍵ではない秘密鍵を使って接続しようとしてたところ、公開鍵を登録していない秘密鍵を指定しても接続されてしまうという事があった。
なんだこりゃと思って-vオプションを付与して見たところ、以下のような動きをしていた。

blacknon@BS-PUB-DEVELOP:~$ cat .ssh/config
Host 192.168.0.119
HostName 192.168.0.119
User root
Port 22
IdentityFile /home/blacknon/.ssh/id_rsa
blacknon@BS-PUB-DEVELOP:~$
blacknon@BS-PUB-DEVELOP:~$ ssh -v -i testkey root@192.168.0.119
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g  1 Mar 2016
debug1: Reading configuration data /home/blacknon/.ssh/config
debug1: /home/blacknon/.ssh/config line 1: Applying options for 192.168.0.119
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 192.168.0.119 [192.168.0.119] port 22.
debug1: Connection established.
debug1: identity file testkey type 1
debug1: key_load_public: No such file or directory
debug1: identity file testkey-cert type -1
debug1: identity file /home/blacknon/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/blacknon/.ssh/id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1
debug1: match: OpenSSH_6.6.1 pat OpenSSH_6.6.1* compat 0x04000000
debug1: Authenticating to 192.168.0.119:22 as 'root'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256@libssh.org
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:  compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC:  compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:3pbP7iBBSKrGlSX/dES1WdvfOsRX7Zjyb9G8tXeeHi4
debug1: Host '192.168.0.119' is known and matches the ECDSA host key.
debug1: Found key in /home/blacknon/.ssh/known_hosts:2
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Next authentication method: publickey
debug1: Offering RSA public key: testkey
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering RSA public key: /home/blacknon/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
Authenticated to 192.168.0.119 ([192.168.0.119]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending environment.
debug1: Sending env LANG = ja_JP.UTF-8
Last login: Wed Jun 21 07:57:32 2017 from 192.168.0.171
[root@BS-PUB-CENT7-02 ~]#

 

どうやら、オプションで指定した秘密鍵で接続できなかった場合、そのまま.ssh/configに記載されている秘密鍵で接続されてしまうようだ。
(オプションで指定した鍵で接続できる場合は、そのままその鍵で接続される)

新しい鍵を登録したりする際のテスト時などにちょっと紛らわしい…。
違う鍵を使って接続する場合は、対象のホストを一時的にコメントアウトするなり、.ssh/configを一時的にリネームするといった対応をすると良さそう。

 

OpenSSH[実践]入門 (Software Design plus) OpenSSH[実践]入門 (Software Design plus)

ターミナル上でヘッダ行の位置は固定して中身だけをソート・シャッフルする

$
0
0

ちょっとしたcsvファイルをソートする際、ヘッダーである1行目はそのままに中身だけソートする必要があったので、ちょっと調べてみた。
で、以下のようにすることで1行目の位置はそのままにソートが可能なので、備忘として残しておく。

awk 'NR==1;NR>1{print $0|"sort"}'
awk 'NR==1;NR>1{print $0|"sort -1krn"}' # 例1) 1列目で数字の降順
awk 'NR==1;NR>1{print $0|"shuf"}'       # 例2) ヘッダー以外の行でシャッフル

blacknon@BS-PUB-DEVELOP:~$ cat test1.csv
header1,header2,header3,header4,header5
Q1,Q2,Q3,Q4,Q5
N1,N2,N3,N4,N5
Y1,Y2,Y3,Y4,Y5
D1,D2,D3,D4,D5
W1,W2,W3,W4,W5
J1,J2,J3,J4,J5
P1,P2,P3,P4,P5
F1,F2,F3,F4,F5
C1,C2,C3,C4,C5
Z1,Z2,Z3,Z4,Z5
T1,T2,T3,T4,T5
R1,R2,R3,R4,R5
O1,O2,O3,O4,O5
K1,K2,K3,K4,K5
X1,X2,X3,X4,X5
A1,A2,A3,A4,A5
E1,E2,E3,E4,E5
U1,U2,U3,U4,U5
H1,H2,H3,H4,H5
B1,B2,B3,B4,B5
M1,M2,M3,M4,M5
L1,L2,L3,L4,L5
V1,V2,V3,V4,V5
I1,I2,I3,I4,I5
G1,G2,G3,G4,G5
S1,S2,S3,S4,S5
blacknon@BS-PUB-DEVELOP:~$
blacknon@BS-PUB-DEVELOP:~$ # 普通にsortした場合
blacknon@BS-PUB-DEVELOP:~$ cat test.csv | sort
A1,A2,A3,A4,A5
B1,B2,B3,B4,B5
C1,C2,C3,C4,C5
D1,D2,D3,D4,D5
E1,E2,E3,E4,E5
F1,F2,F3,F4,F5
G1,G2,G3,G4,G5
H1,H2,H3,H4,H5
I1,I2,I3,I4,I5
J1,J2,J3,J4,J5
K1,K2,K3,K4,K5
L1,L2,L3,L4,L5
M1,M2,M3,M4,M5
N1,N2,N3,N4,N5
O1,O2,O3,O4,O5
P1,P2,P3,P4,P5
Q1,Q2,Q3,Q4,Q5
R1,R2,R3,R4,R5
S1,S2,S3,S4,S5
T1,T2,T3,T4,T5
U1,U2,U3,U4,U5
V1,V2,V3,V4,V5
W1,W2,W3,W4,W5
X1,X2,X3,X4,X5
Y1,Y2,Y3,Y4,Y5
Z1,Z2,Z3,Z4,Z5
header1,header2,header3,header4,header5
blacknon@BS-PUB-DEVELOP:~$
blacknon@BS-PUB-DEVELOP:~$ # Header
blacknon@BS-PUB-DEVELOP:~$ cat test.csv | awk 'NR==1;NR>1{print $0|"sort"}'
header1,header2,header3,header4,header5
A1,A2,A3,A4,A5
B1,B2,B3,B4,B5
C1,C2,C3,C4,C5
D1,D2,D3,D4,D5
E1,E2,E3,E4,E5
F1,F2,F3,F4,F5
G1,G2,G3,G4,G5
H1,H2,H3,H4,H5
I1,I2,I3,I4,I5
J1,J2,J3,J4,J5
K1,K2,K3,K4,K5
L1,L2,L3,L4,L5
M1,M2,M3,M4,M5
N1,N2,N3,N4,N5
O1,O2,O3,O4,O5
P1,P2,P3,P4,P5
Q1,Q2,Q3,Q4,Q5
R1,R2,R3,R4,R5
S1,S2,S3,S4,S5
T1,T2,T3,T4,T5
U1,U2,U3,U4,U5
V1,V2,V3,V4,V5
W1,W2,W3,W4,W5
X1,X2,X3,X4,X5
Y1,Y2,Y3,Y4,Y5
Z1,Z2,Z3,Z4,Z5

というか、こういう風にしてawkからOSコマンドを呼べるとは知らなかった。
調べて見るものだ。
「シェル芸」に効く!AWK処方箋 「シェル芸」に効く!AWK処方箋

bashのブレース展開の区切り文字(デリミタ)を変更して出力する

$
0
0

bashのブレース展開を利用する際、どうしても出力の区切り文字が空白になってしまう。
これをawkのOFSのように、任意の文字にしたいといった場合どうしたらいいのかと調べたところ、サブシェルで一度リストに入れてしまって、そこでIFSを指定して出力時の区切り文字を指定するという方法がよさそうだ。
以下、実行例。ここでは、区切り文字をコロン(:)にしている。

echo $(set 'ABC'{1..10};IFS=:;echo "$*")
[root@BS-PUB-CENT7-01 ~]# echo $(set 'ABC'{1..10};IFS=:;echo "$*")
ABC1:ABC2:ABC3:ABC4:ABC5:ABC6:ABC7:ABC8:ABC9:ABC10

後から置換する方法だと、値にスペースが入っている場合について考える必要があったりするが、この方法ならそれを気にしなくてもよくなる。

[root@BS-PUB-CENT7-01 ~]# echo $(set 'ABC '{1..10};IFS=:;echo "$*")
ABC 1:ABC 2:ABC 3:ABC 4:ABC 5:ABC 6:ABC 7:ABC 8:ABC 9:ABC 10

 

色々と応用がききそうな気がする。

 

フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門 フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門

 

ブレース展開を使って特定のコマンドへパイプ越しに繰り返し処理をさせるワンライナーを、パイプを増やしやすく書く

$
0
0

ハッシュのストレッチングみたいなことをbashでできたら面白いかなと思って調べてたのだけど、特定のコマンドにパイプでn回値を渡す、というような処理はちょっと書くのが難しいようで、以下のようにforとか使ってやる必要があるみたいだ。

# 'Hello World!Yeah!'を3回sha256でストレッチングするという処理をしてる
echo 'Hello World!Yeah!' | (read v; for i in {1..3};do v=$(echo $v | (sha256sum|awk '{print $1}'));done;echo $v;)
echo 'Hello World!Yeah!' | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}')
[root@BS-PUB-CENT7-01 ~]# # 'Hello World!Yeah!'を3回sha256でストレッチングするという処理をしてる
[root@BS-PUB-CENT7-01 ~]# echo 'Hello World!Yeah!' | (read v; for i in {1..3};do v=$(echo $v | (sha256sum|awk '{print $1}'));done;echo $v;)
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 同じ処理をパイプで
[root@BS-PUB-CENT7-01 ~]# echo 'Hello World!Yeah!' | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}')
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4

 

一応、回数も数字で指定できるし、悪くはないけどforということでシングルタスクというのもあるからか、どことなくレスポンスが遅い。

[root@BS-PUB-CENT7-01 ~]# time echo 'Hello World!Yeah!' | (read v; for i in {1..3};do v=$(echo $v | (sha256sum|awk '{print $1}'));done;echo $v;)
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4

real    0m0.544s
user    0m0.003s
sys     0m0.014s
[root@BS-PUB-CENT7-01 ~]# time echo 'Hello World!Yeah!' | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}')
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4

real    0m0.114s
user    0m0.003s
sys     0m0.009s

これではちょっと面白く無いよねということで、数字での回数指定はできないけれどブレース展開を使ってパイプをつなげ続けるのと同等の処理をさせてみた。
以下、実行例。

eval $(set echo\ 'Hello World!Yeah!' '(sha256sum|awk "{print \$1}")'{,,};IFS=\|;echo "$*")
[root@BS-PUB-CENT7-01 ~]# echo $(set echo\ 'Hello World!Yeah!' '(sha256sum|awk "{print \$1}")'{,,};IFS=\|;echo "$*")
echo Hello World!Yeah!|(sha256sum|awk "{print \$1}")|(sha256sum|awk "{print \$1}")|(sha256sum|awk "{print \$1}")
[root@BS-PUB-CENT7-01 ~]# eval $(set echo\ 'Hello World!Yeah!' '(sha256sum|awk "{print \$1}")'{,,};IFS=\|;echo "$*")
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4
[root@BS-PUB-CENT7-01 ~]# time eval $(set echo\ 'Hello World!Yeah!' '(sha256sum|awk "{print \$1}")'{,,};IFS=\|;echo "$*")
13ee5ecfc8a123d816aae799d5233281622ef66d88a3f4e3a8a86655452218b4

real    0m0.174s
user    0m0.004s
sys     0m0.010s

 

ちょっとわかりにくい書き方になってしまうのだが、まぁ回数増やすのにはカンマ(,)足すだけだし、悪くは無さそう。
ちなみに、試しにパイプを通してコマンドを実行する回数を10回くらいにした場合のパフォーマンスはこんな感じ。

[root@BS-PUB-CENT7-01 ~]# time echo 'Hello World!Yeah!' | (read v; for i in {1..10};do v=$(echo $v | (sha256sum|awk '{print $1}'));done;echo $v;)
6b88b3fa44e36e030c175b5d53139079e7f660712c4ae005174dc2fcabe1a4f5

real    0m1.689s
user    0m0.009s
sys     0m0.036s
[root@BS-PUB-CENT7-01 ~]# time echo 'Hello World!Yeah!' | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}') | (sha256sum|awk '{print $1}')
6b88b3fa44e36e030c175b5d53139079e7f660712c4ae005174dc2fcabe1a4f5

real    0m0.158s
user    0m0.008s
sys     0m0.034s
[root@BS-PUB-CENT7-01 ~]# time eval $(set echo\ 'Hello World!Yeah!' '(sha256sum|awk "{print \$1}")'{,,,,,,,,,};IFS=\|;echo "$*")
6b88b3fa44e36e030c175b5d53139079e7f660712c4ae005174dc2fcabe1a4f5

real    0m0.206s
user    0m0.008s
sys     0m0.033s

 

単純にパイプつなげただけの処理には及ばないものの、単純にforを使った処理に比べたらかなり早いようだ。

 

シェルプログラミング実用テクニック (Software Design plus) シェルプログラミング実用テクニック (Software Design plus)

awkでファイルの最長行の長さを求める

$
0
0

awkでファイルの最長行の長さを求める必要があったので、念のため備忘で残しておく。
特に難しいこともなく、以下のようにlengthで取得してやればいい。

awk '{l=length($0);if(m<l) m=l}END{print m}'

blacknon@BS-PUB-UBUNTU-01:~$ cat test3.txt
1
22
333
4444
333
22
1
blacknon@BS-PUB-UBUNTU-01:~$ cat test3.txt | awk '{l=length($0);if(m<l) m=l}END{print m}'
4

 

「シェル芸」に効く!AWK処方箋 「シェル芸」に効く!AWK処方箋

dmidecodeを使わずにCPUやメモリ、マザーボードのベンダーや型番といった情報を取得する

$
0
0

Linuxでハードウェアの情報(CPUやメモリの型番やマザーボードの型番、シリアルナンバーなど)を取得する場合、dmidecodeを使って取得する場合が多い…のだが、このdmidecodeが利用できない場合、どうやってマザーボードやCPU、メモリの情報を得ればいいだろう。というわけで、ちょっと調べてみた。

1.CPUについて

dmidecodeでは、以下のようにコマンドを実行することで、CPUのハードウェア情報を得ることができる。

dmidecode --type processor
# dmidecode --type processor
# dmidecode 2.12-dmifs
SMBIOS 2.7 present.

Handle 0x0004, DMI type 4, 42 bytes
Processor Information
        Socket Designation: SOCKET 0
        Type: Central Processor
        Family: Xeon
        Manufacturer: Intel
        ID: D7 06 02 00 FF FB EB BF
        Signature: Type 0, Family 6, Model 45, Stepping 7
        Flags:
                FPU (Floating-point unit on-chip)
                VME (Virtual mode extension)
                DE (Debugging extension)
                PSE (Page size extension)
                TSC (Time stamp counter)
                MSR (Model specific registers)
                PAE (Physical address extension)
                MCE (Machine check exception)
                CX8 (CMPXCHG8 instruction supported)
                APIC (On-chip APIC hardware supported)
                SEP (Fast system call)
                MTRR (Memory type range registers)
                PGE (Page global enable)
                MCA (Machine check architecture)
                CMOV (Conditional move instruction supported)
                PAT (Page attribute table)
                PSE-36 (36-bit page size extension)
                CLFSH (CLFLUSH instruction supported)
                DS (Debug store)
                ACPI (ACPI supported)
                MMX (MMX technology supported)
                FXSR (FXSAVE and FXSTOR instructions supported)
                SSE (Streaming SIMD extensions)
                SSE2 (Streaming SIMD extensions 2)
                SS (Self-snoop)
                HTT (Multi-threading)
                TM (Thermal monitor supported)
                PBE (Pending break enabled)
        Version: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
        Voltage: 0.0 V
        External Clock: 100 MHz
        Max Speed: 4000 MHz
        Current Speed: 2600 MHz
        Status: Populated, Enabled
        Upgrade: Socket LGA2011
        L1 Cache Handle: 0x0005
        L2 Cache Handle: 0x0006
        L3 Cache Handle: 0x0007
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Core Count: 8
        Core Enabled: 8
        Thread Count: 16
        Characteristics:
                64-bit capable

Handle 0x0008, DMI type 4, 42 bytes
Processor Information
        Socket Designation: SOCKET 1
        Type: Central Processor
        Family: Xeon
        Manufacturer: Intel
        ID: D7 06 02 00 FF FB EB BF
        Signature: Type 0, Family 6, Model 45, Stepping 7
        Flags:
                FPU (Floating-point unit on-chip)
                VME (Virtual mode extension)
                DE (Debugging extension)
                PSE (Page size extension)
                TSC (Time stamp counter)
                MSR (Model specific registers)
                PAE (Physical address extension)
                MCE (Machine check exception)
                CX8 (CMPXCHG8 instruction supported)
                APIC (On-chip APIC hardware supported)
                SEP (Fast system call)
                MTRR (Memory type range registers)
                PGE (Page global enable)
                MCA (Machine check architecture)
                CMOV (Conditional move instruction supported)
                PAT (Page attribute table)
                PSE-36 (36-bit page size extension)
                CLFSH (CLFLUSH instruction supported)
                DS (Debug store)
                ACPI (ACPI supported)
                MMX (MMX technology supported)
                FXSR (FXSAVE and FXSTOR instructions supported)
                SSE (Streaming SIMD extensions)
                SSE2 (Streaming SIMD extensions 2)
                SS (Self-snoop)
                HTT (Multi-threading)
                TM (Thermal monitor supported)
                PBE (Pending break enabled)
        Version: Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
        Voltage: 0.0 V
        External Clock: 100 MHz
        Max Speed: 4000 MHz
        Current Speed: 2600 MHz
        Status: Populated, Enabled
        Upgrade: Socket LGA2011
        L1 Cache Handle: 0x0009
        L2 Cache Handle: 0x000A
        L3 Cache Handle: 0x000B
        Serial Number: Not Specified
        Asset Tag: Not Specified
        Part Number: Not Specified
        Core Count: 8
        Core Enabled: 8
        Thread Count: 16
        Characteristics:
                64-bit capable

 

dmidecodeを使わずにCPUに関する同様の情報を得る場合は、/proc/cpuinfoファイルから取得できる。
以下、KVM上で取得した際の実行例。

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.958
cache size      : 4096 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl pni cx16 x2apic hypervisor lahf_lm
bugs            :
bogomips        : 3999.91
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 15
model           : 6
model name      : Common KVM processor
stepping        : 1
microcode       : 0x1
cpu MHz         : 1999.958
cache size      : 4096 KB
physical id     : 0
siblings        : 2
core id         : 1
cpu cores       : 2
apicid          : 1
initial apicid  : 1
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl pni cx16 x2apic hypervisor lahf_lm
bugs            :
bogomips        : 3999.91
clflush size    : 64
cache_alignment : 128
address sizes   : 40 bits physical, 48 bits virtual
power management:

ただ型番やコア数だけが知りたい場合だと、このままではちょっと見にくいので、少々加工しよう。
Model Nameのみを抽出して、かつ集計をすることで、コア数(スレッド数)もわかるようになる。
KVMのだと味気ないので、仮想基盤で使ってるProxmoxのを例にする。一番左がコア数。

awk -F: '/model name/{print $2}' /proc/cpuinfo | uniq -c
root@BS-PHY-PROX-01:~# awk -F: '/model name/{print $2}' /proc/cpuinfo | uniq -c
     24  Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz

2.メモリについて

dmidecodeでは、以下のようにコマンドを実行することで、刺さっているメモリの情報を得ることができる(対応していれば、メモリのメーカーだったり型番も得られる)。

dmidecode --type memory
# dmidecode --type memory
# dmidecode 2.12-dmifs
SMBIOS 2.7 present.

Handle 0x0015, DMI type 16, 23 bytes
Physical Memory Array
        Location: System Board Or Motherboard
        Use: System Memory
        Error Correction Type: Multi-bit ECC
        Maximum Capacity: 128 GB
        Error Information Handle: Not Provided
        Number Of Devices: 8

Handle 0x0017, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0015
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: P1_DIMMA1
        Bank Locator: Node0_Bank0
        Type: DDR3
        Type Detail: Registered (Buffered)
        Speed: 1333 MHz
        Manufacturer: Samsung
        Serial Number: 837446CD
        Asset Tag: Dimm0_AssetTag
        Part Number: M393B1K70CH0-
        Rank: 1
        Configured Clock Speed: 1333 MHz
…

 

単純に、搭載している(使える)メモリ容量だけを見るのならfreeコマンドや/proc/meminfoで得られる。

free -h | awk '/^Mem/{print $2}'
cat /proc/meminfo | awk '/^MemTotal/{print $2}' | xargs -I@ echo "@ * 1024" | bc | numfmt --to=iec

 

そうじゃない、dmidecodeのように、メモリ何本刺さってるんだかとか、知れるならメモリのメーカーとかを知りたいんだ、といったについては、/sys配下を調べてみたのだが見つけられなかった。
どっかには情報あると思うんだけどなぁ…(dmidecode自体は/dev/mem配下から情報を取ってきてるようなのだが…)。

3.マザーボード・BIOSについて

dmidecodeでは、以下のようにコマンドを実行することでマザーボードやBIOSの情報を得ることができる。
ここから、KVMとか使ってることを推測可能(それだと面白く無いので、実行例は手元の環境で実行)。

dmidecode -t BIOS
dmidecode -t System
dmidecode -t BaseBoard
root@BS-PHY-PROX-01:~# dmidecode -t BIOS
# dmidecode 2.12
SMBIOS 2.5 present.

Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
        Vendor: FUJITSU // Phoenix Technologies Ltd.
        Version: 6.00 Rev. 1.04.2619.N1
        Release Date: 05/18/2010
        Address: 0xE4120
        Runtime Size: 114400 bytes
        ROM Size: 2048 kB
        Characteristics:
                PCI is supported
                PNP is supported
                BIOS is upgradeable
                BIOS shadowing is allowed
                ESCD support is available
                Boot from CD is supported
                Selectable boot is supported
                EDD is supported
                Print screen service is supported (int 5h)
                8042 keyboard services are supported (int 9h)
                Serial services are supported (int 14h)
                Printer services are supported (int 17h)
                CGA/mono video services are supported (int 10h)
                ACPI is supported
                USB legacy is supported
                BIOS boot specification is supported
                Targeted content distribution is supported
        BIOS Revision: 1.4

Handle 0x0029, DMI type 13, 22 bytes
BIOS Language Information
        Language Description Format: Long
        Installable Languages: 1
                en|US|iso8859-1
        Currently Installed Language: en|US|iso8859-1

root@BS-PHY-PROX-01:~# dmidecode -t System
# dmidecode 2.12
SMBIOS 2.5 present.

Handle 0x0001, DMI type 1, 27 bytes
System Information
        Manufacturer: FUJITSU-SV
        Product Name: PRIMERGY
        Version: GS01
        Serial Number: MA6T003081
        UUID: FA32B660-6CF2-11DF-A847-00199982CD2A
        Wake-up Type: Power Switch
        SKU Number: S26361-K1344-Vxxx
        Family: SERVER

Handle 0x0028, DMI type 12, 5 bytes
System Configuration Options
        Option 1: DIP1 ON: Recovery BIOS active
        Option 2: DIP2 ON: Reserved
        Option 3: DIP3 ON: Flash BIOS write protect
        Option 4: DIP4 ON: Reserved

Handle 0x0050, DMI type 32, 11 bytes
System Boot Information
        Status: No errors detected

root@BS-PHY-PROX-01:~# dmidecode -t BaseBoard
# dmidecode 2.12
SMBIOS 2.5 present.

Handle 0x0002, DMI type 2, 109 bytes
Base Board Information
        Manufacturer: FUJITSU
        Product Name: D2619
        Version: S26361-D2619-N15 WGS10 GS01
        Serial Number: 33260167
        Asset Tag: -
        Features:
                Board is a hosting board
                Board is removable
        Location In Chassis: -
        Chassis Handle: 0x0003
        Type: Motherboard
        Contained Object Handles: 47
                0x0004
                0x0005
                0x000E
                0x000F
                0x0010
                0x0011
                0x0012
                0x0013
                0x0014
                0x0015
                0x0016
                0x0017
                0x0018
                0x0019
                0x001A
                0x001B
                0x001C
                0x001D
                0x001E
                0x001F
                0x0020
                0x0021
                0x0022
                0x0023
                0x0024
                0x0025
                0x0026
                0x0027
                0x0028
                0x002D
                0x002E
                0x002F
                0x0030
                0x0031
                0x0032
                0x0033
                0x0034
                0x0035
                0x0036
                0x0037
                0x0038
                0x0039
                0x003A
                0x003B
                0x003C
                0x003D
                0x003E

Handle 0x0026, DMI type 10, 10 bytes
On Board Device 1 Information
        Type: Video
        Status: Disabled
        Description: MATROX
On Board Device 2 Information
        Type: Ethernet
        Status: Disabled
        Description: Intel 82575EB
On Board Device 3 Information
        Type: Other
        Status: Disabled
        Description: IPMI iRMC S2

 

で、これら型番やシリアルナンバーをdmidecode使わずに得る場合、以下のディレクトリにあるファイルからある程度得ることができる。
(地味にdmidecodeで得た情報には載ってないサーバの型番が載ってたりする。)

/sys/devices/virtual/dmi/id/
root@BS-PHY-PROX-01:~# grep -R '' /sys/devices/virtual/dmi/id/
/sys/devices/virtual/dmi/id/product_name:PRIMERGY
/sys/devices/virtual/dmi/id/product_uuid:FA32B660-6CF2-11DF-A847-00199982CD2A
/sys/devices/virtual/dmi/id/board_name:D2619
/sys/devices/virtual/dmi/id/board_asset_tag:-
/sys/devices/virtual/dmi/id/power/control:auto
/sys/devices/virtual/dmi/id/power/async:disabled
/sys/devices/virtual/dmi/id/power/runtime_enabled:disabled
/sys/devices/virtual/dmi/id/power/runtime_active_kids:0
/sys/devices/virtual/dmi/id/power/runtime_active_time:0
grep: /sys/devices/virtual/dmi/id/power/autosuspend_delay_ms: Input/output error
/sys/devices/virtual/dmi/id/power/runtime_status:unsupported
/sys/devices/virtual/dmi/id/power/runtime_usage:0
/sys/devices/virtual/dmi/id/power/runtime_suspended_time:0
/sys/devices/virtual/dmi/id/chassis_serial:MA6T003081
/sys/devices/virtual/dmi/id/product_version:GS01
/sys/devices/virtual/dmi/id/chassis_vendor:FUJITSU-SV
/sys/devices/virtual/dmi/id/modalias:dmi:bvnFUJITSU//PhoenixTechnologiesLtd.:bvr6.00Rev.1.04.2619.N1:bd05/18/2010:svnFUJITSU-SV:pnPRIMERGY:pvrGS01:rvnFUJITSU:rnD2619:rvrS26361-D2619-N15WGS10GS01:cvnFUJITSU-SV:ct23:cvrRX300S6R1:
/sys/devices/virtual/dmi/id/chassis_version:RX300S6R1
/sys/devices/virtual/dmi/id/bios_date:05/18/2010
/sys/devices/virtual/dmi/id/bios_version:6.00 Rev. 1.04.2619.N1
/sys/devices/virtual/dmi/id/product_serial:MA6T003081
/sys/devices/virtual/dmi/id/sys_vendor:FUJITSU-SV
grep: warning: /sys/devices/virtual/dmi/id/subsystem/id: recursive directory loop
/sys/devices/virtual/dmi/id/bios_vendor:FUJITSU // Phoenix Technologies Ltd.
/sys/devices/virtual/dmi/id/board_serial:33260167
/sys/devices/virtual/dmi/id/uevent:MODALIAS=dmi:bvnFUJITSU//PhoenixTechnologiesLtd.:bvr6.00Rev.1.04.2619.N1:bd05/18/2010:svnFUJITSU-SV:pnPRIMERGY:pvrGS01:rvnFUJITSU:rnD2619:rvrS26361-D2619-N15WGS10GS01:cvnFUJITSU-SV:ct23:cvrRX300S6R1:
/sys/devices/virtual/dmi/id/chassis_asset_tag:MA6T003081
/sys/devices/virtual/dmi/id/chassis_type:23
/sys/devices/virtual/dmi/id/board_vendor:FUJITSU
/sys/devices/virtual/dmi/id/board_version:S26361-D2619-N15 WGS10 GS01

 

基本、dmidecode使えればなんとかなると思うが、使えない環境から色々と推測する際に利用できるのでは無いだろうか。

 

富士PCサーバ TX1310M1 XeonE3-1226v3(3,30GHz/8MB/4コア) 4GB/250GB×2(RAIDO1) OSレス 富士PCサーバ TX1310M1 XeonE3-1226v3(3,30GHz/8MB/4コア) 4GB/250GB×2(RAIDO1) OSレス

Linuxでシェル芸を使ってワードリストから簡単なレインボーテーブルを生成する

$
0
0

ふと、シェル芸でワードリストから簡単なレインボーテーブルを生成することができないかと思ったので、ちょっとやってみることにした。
記号系にエスケープが必要だったりするので、その辺に注意が必要かも。とりあえず、以下のようにコマンドを実行することで、「パスワード ハッシュ値」の形式でワードリストが生成できた(sha256sumのトコは、ターゲットとなる形式に応じて切り替えて於けばいいだろう。md5sumとか。)。なお、速度向上のためxargsでパラレルでの実行をさせている。

cat パスワードリスト | sed -e "s/$/\x0/g" -e 's/`/\\`/g' | xargs -P32 -n1 -0 -I@ bash -c 'echo $(printf %s "@ "&&printf %s "@"|(sha256sum|awk "{print \$1}")) >> ./passlist'

[root@BS-PUB-CENT7-01 ~]# head passlist
123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
password 9167f9906b89001707ab4097bb5f66ac6e87912e3a9c74dc631a2c7a32f4e3dc
12345678 20dd707d7f0294e1cf29f017f69579613ea2c431505f329416cf5f9b4d561791
qwerty 9903e2c63e038914646a62ddbada2d5ecd56f0eedcb62f011d63de82aca8d1f2
123456789 6c7ecb2ae699cd2cb66ab58daf48ee88d03a802ff7f2fc1aa13bcd96b57c7460
12345 efe1e01888dcdbf842d5f12cac170770d5bd125a9fd5285b14ac4f50bb74dd4d
1234 55ba86eef2e42591651237755f306e71b9e85f2e6019b6e5ca514d9dd09c1bd2
111111 765a690246b9f7d1ebe70b788dd49fc2dfeb79555d1cacb1188944ca9d7ced30
1234567 452e1de0e5569f7ed2a3b671a3dd077600d389039fe7f9aa8045119e8035243e
dragon bb2531bb80b2227d1d15630017298071458d24210f66493cf17db273181669dc
[root@BS-PUB-CENT7-01 ~]# head md5_passlist
123456 e10adc3949ba59abbe56e057f20f883e
password 768d0813cde672ef751a0af70cc0bc7f
12345678 a7cc59c68949f4e4b412f257eeac2764
qwerty e5bd0a793460559be2e689d39ad9f037
123456789 0410fc9e0286052679fbfd3d62d95043
12345 b89a8b9593b5ff58e68f36dfe7bf85f9
1234 d8e5f94d2ac91ce895e9b6a8dda03788
111111 ca36e8a4e28ad8130b13a28db8f41133
1234567 4d92026ad5e5dd1ff65b3bb205273865
dragon d3cfcabc3a11f7a93fa3fe04348eafdf

 

パラレルで実行したとしても、出力完了までにはそれなりに時間がかかる。時間がある時にちょこちょこ進めていくといいだろう。
最後の行で空行のハッシュ値が入ってしまうので、気になるようならtestで正常終了かどうかを入れるといいだろう。なお、ソルトやストレッチングをする場合は、それぞれ以下のように記述してやればいい。

# soltを入れる場合。末尾に入れるならsedの指定を^から$に変えるなど。
cat パスワードリスト | sed -e "s/$/\x0/g" -e 's/`/\\`/g' -e 's/^/solt/g' | xargs -P32 -n1 -0 -I@ bash -c 'echo $(printf %s "@ "&&printf %s "@"|(sha256sum|awk "{print \$1}")) >> ./passlist'
# ストレッチングを入れる場合。
cat パスワードリスト | sed -e "s/$/\x0/g" -e 's/`/\\`/g' | xargs -P32 -n1 -0 -I@ bash -c 'echo $(printf %s "@ "&&printf %s "@"|(sha256sum|awk "{print \$1}")|(sha256sum|awk "{print \$1}")|(sha256sum|awk "{print \$1}")) >> ./passlist'

 

ストレッチングについては、この辺を参考にブレース展開で処理を増やさせる書き方もあるにはあるのだが、エスケープとかが面倒なのでこんな感じで。
一応、シェル芸でレインボーテーブルの生成もできなくはないというのが確認できた(マルチプロセスでキックできるので、見てるとむしろ早いかも…?)ので、必要な時にはこれで作ろうかな。
ワードリストについては、この辺を使うとよさそうだ。

 

パスワード解析 完全版 パスワード解析 完全版

bash4.0以降で追加されたコプロセス(coprocess)を使ってみる

$
0
0

最近知ったのだが、bash 4.0以降ではコプロセス(coprocess)なる機能が追加されているらしい。名前付きのバックグラウンドジョブみたいなもので、コマンドを指定して起動後、値を渡したら処理した値を後から抜き出す事ができるらしい。コマンドの機能をデーモン化するようなイメージだろうか?
以下、実際に使ってみた例。視覚的にわかりやすいよう、awkで頭に文字列を追加するような処理にしている。

# コプロセスの生成
coproc AWK_COPROC { awk '{print "AWK_" $0;fflush()}' ;}

# 値をコプロセスに渡す
echo test >&"${AWK_COPROC[1]}"

# 値をコプロセスから抜き出す
read var <&"${AWK_COPROC[0]}";echo $var
[root@BS-PUB-CENT7-01 ~]# # コプロセスの生成
[root@BS-PUB-CENT7-01 ~]# coproc AWK_COPROC { awk '{print "AWK_" $0;fflush()}' ;}
[1] 17000
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 値をコプロセスに渡す
[root@BS-PUB-CENT7-01 ~]# echo test >&"${AWK_COPROC[1]}"
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 値をコプロセスから抜き出す
[root@BS-PUB-CENT7-01 ~]# read var <&"${AWK_COPROC[0]}";echo $var
AWK_test

試してる間に引っかかったのだが、sedなどを使ってみると、値が返ってこない。
これは、コマンドがバッファしてしまってるので読み取りが完了せず、値が返ってこなくなるのが原因のようだ。coprocでの書き方に工夫が必要になりそうだ。

[root@BS-PUB-CENT7-01 ~]# coproc SED_COPROC { sed 's/$/_TEST/g' ;}
[1] 17072
[root@BS-PUB-CENT7-01 ~]# echo test >&"${SED_COPROC[1]}"
[root@BS-PUB-CENT7-01 ~]# read var <&"${SED_COPROC[0]}";echo $var
←値が返ってこないで待機状態になる

 

この機能でsedを使う場合は、-uなんかでフラッシュするように指定してやると良いだろう。
使いどころが難しそうな感じだけど、うまく使えれば便利なような…?どうなんだろう。

 

【参考】

 

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

sedやawk、grepをバッファさせずに動作させる

$
0
0

ログの監視やなんやらで、tail -Fなどと組み合わせて使用する機会の多いsedやawk、grepだが、デフォルトの動作ではバッファリングされてしまう。
これをバッファしないように実行する場合、以下のようにコマンドを実行する。

sedの場合

GNU拡張されているsedの場合、-uオプションというオプションがあるので、それを用いる。

sed -u '~'
sed --unbuffered '~'

 

注意したいのが、Mac OS XのsedコマンドなどGNU拡張でないsedの場合、-uオプションが無い。
この場合は、後述するstdbufを用いるか、(どっちにしろcoreutils入れるので)gsedを用いるといいだろう。

awkの場合

awkの場合、print直後にfflush()関数を呼び出すことでバッファリングを回避できる。

awk '{print $0;fflush()}'

grepの場合

grepの場合、「–line-buffered」オプションを付与することで、バッファリングを回避できる。
OS Xのgrepコマンドでも使用可能。

grep --line-buffered

perlの場合

perlのワンライナーでバッファリングを回避する場合、以下のようにオートフラッシュを有効化(「$|=1;」で有効化している)しておく。

perl -pe '$|=1;s/aaa/111/'

 

【参考】

stdbufコマンドを用いる

バッファリングを回避するオプションのないコマンドの場合、coreutilsのstdbufコマンドを利用するとバッファリングをさせずにコマンドを実行することができる。

stdbuf -i0 -o0 -e0 コマンド

scriptコマンドを用いる

もしくは、scriptコマンドを経由することで擬似端末越しにコマンドを実行させることで、バッファリングをさせないという方法も取れるようだ。

script -q /dev/null 継続実行コマンド | 出力コマンド # Mac OS Xなど
script -q -c "継続実行コマンド" /dev/null | 出力コマンド # Linux系

 

【参考】

 

UNIXプログラミング環境 UNIXプログラミング環境

ターミナル上でカウントダウン後にコマンドを実行させる

$
0
0

日曜の夜、ふと『コンソール上でカウントダウン後にコマンドの実行とかさせてみよう』と何故か思いついたので、ちょっとやってみた。
簡単なカウントダウンであれば、以下のようにコマンドを実行すればいい(bannerやlolcatは文字を大きく表示させるためのものなので、必要なければechoとかに書き換えればいい)。

echo {3..0} | xargs -d' ' -I@ -n1 bash -c 'clear;banner "@" && sleep 1' && banner 'Boom!!!!!!!!!' | lolcat

 

…まぁ、コレだけなんだけど。
で、似たような何かについて探してたところ、Pythonのツールで『termdown』なるカウントダウン用のコマンドもあるようだ。pipからインストールできる。

pip install termdown

で、以下のように正常終了時に指定したコマンドを実行させるようにすればいい。

termdown 10 && echo abc

 

使うことがあるか不明だけど、まぁこんなこともできるよということで…

 

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術 Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

シェル芸でブレース展開・sedを使って文字列の大文字・小文字やLeet Speak変換全ての組み合わせを取得する

$
0
0

諸事情で文字列の小文字・大文字全ての組合せが欲しくなり、手軽に済ませられないかなと調べてみた。
で、そもそもbashではブレース展開を用いることで、つなげた文字列の組み合わせを生成させることができる。

blacknon@BS-PUB-UBUNTU-01:~$ echo {a,b,c}{1,2,3}
a1 a2 a3 b1 b2 b3 c1 c2 c3

 

つまり、sedで対象の文字列を1文字づつ大文字・小文字ブレース展開で利用できる書き方に変換させてやり、evalなどで出力させてやればいいということになる。
実際にやってみた結果が以下。(Macの場合はgsedで実行)

# evalでやる場合
eval echo $(echo password | sed -e 's/./{\L&,\U&}/g')

# 最初にechoしてxargsで実行させる場合
echo password | sed -e 's/./{\L&,\U&}/g' | xargs -I@ bash -c 'echo @'
blacknon@BS-PUB-UBUNTU-01:~$ echo password
password
blacknon@BS-PUB-UBUNTU-01:~$ echo password | sed -e 's/./{\L&,\U&}/g'
{p,P}{a,A}{s,S}{s,S}{w,W}{o,O}{r,R}{d,D}
blacknon@BS-PUB-UBUNTU-01:~$ echo password | sed -e 's/./{\L&,\U&}/g' | xargs -I@ bash -c 'echo @'
password passworD passwoRd passwoRD passwOrd passwOrD passwORd passwORD passWord passWorD passWoRd passWoRD passWOrd passWOrD passWORd passWORD pasSword pasSworD pasSwoRd pasSwoRD pasSwOrd pasSwOrD pasSwORd pasSwORD pasSWord pasSWorD pasSWoRd pasSWoRD pasSWOrd pasSWOrD pasSWORd pasSWORD paSsword paSsworD paSswoRd paSswoRD paSswOrd paSswOrD paSswORd paSswORD paSsWord paSsWorD paSsWoRd paSsWoRD paSsWOrd paSsWOrD paSsWORd paSsWORD paSSword paSSworD paSSwoRd paSSwoRD paSSwOrd paSSwOrD paSSwORd paSSwORD paSSWord paSSWorD paSSWoRd paSSWoRD paSSWOrd paSSWOrD paSSWORd paSSWORD pAssword pAssworD pAsswoRd pAsswoRD pAsswOrd pAsswOrD pAsswORd pAsswORD pAssWord pAssWorD pAssWoRd pAssWoRD pAssWOrd pAssWOrD pAssWORd pAssWORD pAsSword pAsSworD pAsSwoRd pAsSwoRD pAsSwOrd pAsSwOrD pAsSwORd pAsSwORD pAsSWord pAsSWorD pAsSWoRd pAsSWoRD pAsSWOrd pAsSWOrD pAsSWORd pAsSWORD pASsword pASsworD pASswoRd pASswoRD pASswOrd pASswOrD pASswORd pASswORD pASsWord pASsWorD pASsWoRd pASsWoRD pASsWOrd pASsWOrD pASsWORd pASsWORD pASSword pASSworD pASSwoRd pASSwoRD pASSwOrd pASSwOrD pASSwORd pASSwORD pASSWord pASSWorD pASSWoRd pASSWoRD pASSWOrd pASSWOrD pASSWORd pASSWORD Password PassworD PasswoRd PasswoRD PasswOrd PasswOrD PasswORd PasswORD PassWord PassWorD PassWoRd PassWoRD PassWOrd PassWOrD PassWORd PassWORD PasSword PasSworD PasSwoRd PasSwoRD PasSwOrd PasSwOrD PasSwORd PasSwORD PasSWord PasSWorD PasSWoRd PasSWoRD PasSWOrd PasSWOrD PasSWORd PasSWORD PaSsword PaSsworD PaSswoRd PaSswoRD PaSswOrd PaSswOrD PaSswORd PaSswORD PaSsWord PaSsWorD PaSsWoRd PaSsWoRD PaSsWOrd PaSsWOrD PaSsWORd PaSsWORD PaSSword PaSSworD PaSSwoRd PaSSwoRD PaSSwOrd PaSSwOrD PaSSwORd PaSSwORD PaSSWord PaSSWorD PaSSWoRd PaSSWoRD PaSSWOrd PaSSWOrD PaSSWORd PaSSWORD PAssword PAssworD PAsswoRd PAsswoRD PAsswOrd PAsswOrD PAsswORd PAsswORD PAssWord PAssWorD PAssWoRd PAssWoRD PAssWOrd PAssWOrD PAssWORd PAssWORD PAsSword PAsSworD PAsSwoRd PAsSwoRD PAsSwOrd PAsSwOrD PAsSwORd PAsSwORD PAsSWord PAsSWorD PAsSWoRd PAsSWoRD PAsSWOrd PAsSWOrD PAsSWORd PAsSWORD PASsword PASsworD PASswoRd PASswoRD PASswOrd PASswOrD PASswORd PASswORD PASsWord PASsWorD PASsWoRd PASsWoRD PASsWOrd PASsWOrD PASsWORd PASsWORD PASSword PASSworD PASSwoRd PASSwoRD PASSwOrd PASSwOrD PASSwORd PASSwORD PASSWord PASSWorD PASSWoRd PASSWoRD PASSWOrd PASSWOrD PASSWORd PASSWORD
blacknon@BS-PUB-UBUNTU-01:~$ eval echo $(echo password | sed -e 's/./{\L&,\U&}/g')
password passworD passwoRd passwoRD passwOrd passwOrD passwORd passwORD passWord passWorD passWoRd passWoRD passWOrd passWOrD passWORd passWORD pasSword pasSworD pasSwoRd pasSwoRD pasSwOrd pasSwOrD pasSwORd pasSwORD pasSWord pasSWorD pasSWoRd pasSWoRD pasSWOrd pasSWOrD pasSWORd pasSWORD paSsword paSsworD paSswoRd paSswoRD paSswOrd paSswOrD paSswORd paSswORD paSsWord paSsWorD paSsWoRd paSsWoRD paSsWOrd paSsWOrD paSsWORd paSsWORD paSSword paSSworD paSSwoRd paSSwoRD paSSwOrd paSSwOrD paSSwORd paSSwORD paSSWord paSSWorD paSSWoRd paSSWoRD paSSWOrd paSSWOrD paSSWORd paSSWORD pAssword pAssworD pAsswoRd pAsswoRD pAsswOrd pAsswOrD pAsswORd pAsswORD pAssWord pAssWorD pAssWoRd pAssWoRD pAssWOrd pAssWOrD pAssWORd pAssWORD pAsSword pAsSworD pAsSwoRd pAsSwoRD pAsSwOrd pAsSwOrD pAsSwORd pAsSwORD pAsSWord pAsSWorD pAsSWoRd pAsSWoRD pAsSWOrd pAsSWOrD pAsSWORd pAsSWORD pASsword pASsworD pASswoRd pASswoRD pASswOrd pASswOrD pASswORd pASswORD pASsWord pASsWorD pASsWoRd pASsWoRD pASsWOrd pASsWOrD pASsWORd pASsWORD pASSword pASSworD pASSwoRd pASSwoRD pASSwOrd pASSwOrD pASSwORd pASSwORD pASSWord pASSWorD pASSWoRd pASSWoRD pASSWOrd pASSWOrD pASSWORd pASSWORD Password PassworD PasswoRd PasswoRD PasswOrd PasswOrD PasswORd PasswORD PassWord PassWorD PassWoRd PassWoRD PassWOrd PassWOrD PassWORd PassWORD PasSword PasSworD PasSwoRd PasSwoRD PasSwOrd PasSwOrD PasSwORd PasSwORD PasSWord PasSWorD PasSWoRd PasSWoRD PasSWOrd PasSWOrD PasSWORd PasSWORD PaSsword PaSsworD PaSswoRd PaSswoRD PaSswOrd PaSswOrD PaSswORd PaSswORD PaSsWord PaSsWorD PaSsWoRd PaSsWoRD PaSsWOrd PaSsWOrD PaSsWORd PaSsWORD PaSSword PaSSworD PaSSwoRd PaSSwoRD PaSSwOrd PaSSwOrD PaSSwORd PaSSwORD PaSSWord PaSSWorD PaSSWoRd PaSSWoRD PaSSWOrd PaSSWOrD PaSSWORd PaSSWORD PAssword PAssworD PAsswoRd PAsswoRD PAsswOrd PAsswOrD PAsswORd PAsswORD PAssWord PAssWorD PAssWoRd PAssWoRD PAssWOrd PAssWOrD PAssWORd PAssWORD PAsSword PAsSworD PAsSwoRd PAsSwoRD PAsSwOrd PAsSwOrD PAsSwORd PAsSwORD PAsSWord PAsSWorD PAsSWoRd PAsSWoRD PAsSWOrd PAsSWOrD PAsSWORd PAsSWORD PASsword PASsworD PASswoRd PASswoRD PASswOrd PASswOrD PASswORd PASswORD PASsWord PASsWorD PASsWoRd PASsWoRD PASsWOrd PASsWOrD PASsWORd PASsWORD PASSword PASSworD PASSwoRd PASSwoRD PASSwOrd PASSwOrD PASSwORd PASSwORD PASSWord PASSWorD PASSWoRd PASSWoRD PASSWOrd PASSWOrD PASSWORd PASSWORD

これで、大文字・小文字全ての組み合わせが取得できる。
で、ふとLeetSpeak形式(aを@、oを0などに書き換えるやつ)への変換もこの方法で全種類取得できるかなと思ったので、ちょっとやってみた。
変換ルールは随時書き足して貰えれば、その分パターンは増えるはずだ。あまり長くなるとブレース展開では出力しきれなくなるので注意。

eval echo $(echo password | sed -e 's/./{\L&,\U&}/g' -e 's/a/{a,@}/g' -e 's/s/{s,\\$}/g' -e 's/o/{o,0}/g')
echo password | sed -e 's/./{\L&,\U&}/g' -e 's/a/{a,@}/g' -e 's/s/{s,\\\\$}/g' -e 's/o/{o,0}/g' | xargs -I@ bash -c 'echo @'
blacknon@BS-PUB-UBUNTU-01:~$ eval echo $(echo password | sed -e 's/./{\L&,\U&}/g' -e 's/a/{a,@}/g' -e 's/s/{s,\\$}/g' -e 's/o/{o,0}/g')
password passworD passwoRd passwoRD passw0rd passw0rD passw0Rd passw0RD passwOrd passwOrD passwORd passwORD passWord passWorD passWoRd passWoRD passW0rd passW0rD passW0Rd passW0RD passWOrd passWOrD passWORd passWORD pas$word pas$worD pas$woRd pas$woRD pas$w0rd pas$w0rD pas$w0Rd pas$w0RD pas$wOrd pas$wOrD pas$wORd pas$wORD pas$Word pas$WorD pas$WoRd pas$WoRD pas$W0rd pas$W0rD pas$W0Rd pas$W0RD pas$WOrd pas$WOrD pas$WORd pas$WORD pasSword pasSworD pasSwoRd pasSwoRD pasSw0rd pasSw0rD pasSw0Rd pasSw0RD pasSwOrd pasSwOrD pasSwORd pasSwORD pasSWord pasSWorD pasSWoRd pasSWoRD pasSW0rd pasSW0rD pasSW0Rd pasSW0RD pasSWOrd pasSWOrD pasSWORd pasSWORD pa$sword pa$sworD pa$swoRd pa$swoRD pa$sw0rd pa$sw0rD pa$sw0Rd pa$sw0RD pa$swOrd pa$swOrD pa$swORd pa$swORD pa$sWord pa$sWorD pa$sWoRd pa$sWoRD pa$sW0rd pa$sW0rD pa$sW0Rd pa$sW0RD pa$sWOrd pa$sWOrD pa$sWORd pa$sWORD pa$$word pa$$worD pa$$woRd pa$$woRD pa$$w0rd pa$$w0rD pa$$w0Rd pa$$w0RD pa$$wOrd pa$$wOrD pa$$wORd pa$$wORD pa$$Word pa$$WorD pa$$WoRd pa$$WoRD pa$$W0rd pa$$W0rD pa$$W0Rd pa$$W0RD pa$$WOrd pa$$WOrD pa$$WORd pa$$WORD pa$Sword pa$SworD pa$SwoRd pa$SwoRD pa$Sw0rd pa$Sw0rD pa$Sw0Rd pa$Sw0RD pa$SwOrd pa$SwOrD pa$SwORd pa$SwORD pa$SWord pa$SWorD pa$SWoRd pa$SWoRD pa$SW0rd pa$SW0rD pa$SW0Rd pa$SW0RD pa$SWOrd pa$SWOrD pa$SWORd pa$SWORD paSsword paSsworD paSswoRd paSswoRD paSsw0rd paSsw0rD paSsw0Rd paSsw0RD paSswOrd paSswOrD paSswORd paSswORD paSsWord paSsWorD paSsWoRd paSsWoRD paSsW0rd paSsW0rD paSsW0Rd paSsW0RD paSsWOrd paSsWOrD paSsWORd paSsWORD paS$word paS$worD paS$woRd paS$woRD paS$w0rd paS$w0rD paS$w0Rd paS$w0RD paS$wOrd paS$wOrD paS$wORd paS$wORD paS$Word paS$WorD paS$WoRd paS$WoRD paS$W0rd paS$W0rD paS$W0Rd paS$W0RD paS$WOrd paS$WOrD paS$WORd paS$WORD paSSword paSSworD paSSwoRd paSSwoRD paSSw0rd paSSw0rD paSSw0Rd paSSw0RD paSSwOrd paSSwOrD paSSwORd paSSwORD paSSWord paSSWorD paSSWoRd paSSWoRD paSSW0rd paSSW0rD paSSW0Rd paSSW0RD paSSWOrd paSSWOrD paSSWORd paSSWORD p@ssword p@ssworD p@sswoRd p@sswoRD p@ssw0rd p@ssw0rD p@ssw0Rd p@ssw0RD p@sswOrd p@sswOrD p@sswORd p@sswORD p@ssWord p@ssWorD p@ssWoRd p@ssWoRD p@ssW0rd p@ssW0rD p@ssW0Rd p@ssW0RD p@ssWOrd p@ssWOrD p@ssWORd p@ssWORD p@s$word p@s$worD p@s$woRd p@s$woRD p@s$w0rd p@s$w0rD p@s$w0Rd p@s$w0RD p@s$wOrd p@s$wOrD p@s$wORd p@s$wORD p@s$Word p@s$WorD p@s$WoRd p@s$WoRD p@s$W0rd p@s$W0rD p@s$W0Rd p@s$W0RD p@s$WOrd p@s$WOrD p@s$WORd p@s$WORD p@sSword p@sSworD p@sSwoRd p@sSwoRD p@sSw0rd p@sSw0rD p@sSw0Rd p@sSw0RD p@sSwOrd p@sSwOrD p@sSwORd p@sSwORD p@sSWord p@sSWorD p@sSWoRd p@sSWoRD p@sSW0rd p@sSW0rD p@sSW0Rd p@sSW0RD p@sSWOrd p@sSWOrD p@sSWORd p@sSWORD p@$sword p@$sworD p@$swoRd p@$swoRD p@$sw0rd p@$sw0rD p@$sw0Rd p@$sw0RD p@$swOrd p@$swOrD p@$swORd p@$swORD p@$sWord p@$sWorD p@$sWoRd p@$sWoRD p@$sW0rd p@$sW0rD p@$sW0Rd p@$sW0RD p@$sWOrd p@$sWOrD p@$sWORd p@$sWORD p@$$word p@$$worD p@$$woRd p@$$woRD p@$$w0rd p@$$w0rD p@$$w0Rd p@$$w0RD p@$$wOrd p@$$wOrD p@$$wORd p@$$wORD p@$$Word p@$$WorD p@$$WoRd p@$$WoRD p@$$W0rd p@$$W0rD p@$$W0Rd p@$$W0RD p@$$WOrd p@$$WOrD p@$$WORd p@$$WORD p@$Sword p@$SworD p@$SwoRd p@$SwoRD p@$Sw0rd p@$Sw0rD p@$Sw0Rd p@$Sw0RD p@$SwOrd p@$SwOrD p@$SwORd p@$SwORD p@$SWord p@$SWorD p@$SWoRd p@$SWoRD p@$SW0rd p@$SW0rD p@$SW0Rd p@$SW0RD p@$SWOrd p@$SWOrD p@$SWORd p@$SWORD p@Ssword p@SsworD p@SswoRd p@SswoRD p@Ssw0rd p@Ssw0rD p@Ssw0Rd p@Ssw0RD p@SswOrd p@SswOrD p@SswORd p@SswORD p@SsWord p@SsWorD p@SsWoRd p@SsWoRD p@SsW0rd p@SsW0rD p@SsW0Rd p@SsW0RD p@SsWOrd p@SsWOrD p@SsWORd p@SsWORD p@S$word p@S$worD p@S$woRd p@S$woRD p@S$w0rd p@S$w0rD p@S$w0Rd p@S$w0RD p@S$wOrd p@S$wOrD p@S$wORd p@S$wORD p@S$Word p@S$WorD p@S$WoRd p@S$WoRD p@S$W0rd p@S$W0rD p@S$W0Rd p@S$W0RD p@S$WOrd p@S$WOrD p@S$WORd p@S$WORD p@SSword p@SSworD p@SSwoRd p@SSwoRD p@SSw0rd p@SSw0rD p@SSw0Rd p@SSw0RD p@SSwOrd p@SSwOrD p@SSwORd p@SSwORD p@SSWord p@SSWorD p@SSWoRd p@SSWoRD p@SSW0rd p@SSW0rD p@SSW0Rd p@SSW0RD p@SSWOrd p@SSWOrD p@SSWORd p@SSWORD pAssword pAssworD pAsswoRd pAsswoRD pAssw0rd pAssw0rD pAssw0Rd pAssw0RD pAsswOrd pAsswOrD pAsswORd pAsswORD pAssWord pAssWorD pAssWoRd pAssWoRD pAssW0rd pAssW0rD pAssW0Rd pAssW0RD pAssWOrd pAssWOrD pAssWORd pAssWORD pAs$word pAs$worD pAs$woRd pAs$woRD pAs$w0rd pAs$w0rD pAs$w0Rd pAs$w0RD pAs$wOrd pAs$wOrD pAs$wORd pAs$wORD pAs$Word pAs$WorD pAs$WoRd pAs$WoRD pAs$W0rd pAs$W0rD pAs$W0Rd pAs$W0RD pAs$WOrd pAs$WOrD pAs$WORd pAs$WORD pAsSword pAsSworD pAsSwoRd pAsSwoRD pAsSw0rd pAsSw0rD pAsSw0Rd pAsSw0RD pAsSwOrd pAsSwOrD pAsSwORd pAsSwORD pAsSWord pAsSWorD pAsSWoRd pAsSWoRD pAsSW0rd pAsSW0rD pAsSW0Rd pAsSW0RD pAsSWOrd pAsSWOrD pAsSWORd pAsSWORD pA$sword pA$sworD pA$swoRd pA$swoRD pA$sw0rd pA$sw0rD pA$sw0Rd pA$sw0RD pA$swOrd pA$swOrD pA$swORd pA$swORD pA$sWord pA$sWorD pA$sWoRd pA$sWoRD pA$sW0rd pA$sW0rD pA$sW0Rd pA$sW0RD pA$sWOrd pA$sWOrD pA$sWORd pA$sWORD pA$$word pA$$worD pA$$woRd pA$$woRD pA$$w0rd pA$$w0rD pA$$w0Rd pA$$w0RD pA$$wOrd pA$$wOrD pA$$wORd pA$$wORD pA$$Word pA$$WorD pA$$WoRd pA$$WoRD pA$$W0rd pA$$W0rD pA$$W0Rd pA$$W0RD pA$$WOrd pA$$WOrD pA$$WORd pA$$WORD pA$Sword pA$SworD pA$SwoRd pA$SwoRD pA$Sw0rd pA$Sw0rD pA$Sw0Rd pA$Sw0RD pA$SwOrd pA$SwOrD pA$SwORd pA$SwORD pA$SWord pA$SWorD pA$SWoRd pA$SWoRD pA$SW0rd pA$SW0rD pA$SW0Rd pA$SW0RD pA$SWOrd pA$SWOrD pA$SWORd pA$SWORD pASsword pASsworD pASswoRd pASswoRD pASsw0rd pASsw0rD pASsw0Rd pASsw0RD pASswOrd pASswOrD pASswORd pASswORD pASsWord pASsWorD pASsWoRd pASsWoRD pASsW0rd pASsW0rD pASsW0Rd pASsW0RD pASsWOrd pASsWOrD pASsWORd pASsWORD pAS$word pAS$worD pAS$woRd pAS$woRD pAS$w0rd pAS$w0rD pAS$w0Rd pAS$w0RD pAS$wOrd pAS$wOrD pAS$wORd pAS$wORD pAS$Word pAS$WorD pAS$WoRd pAS$WoRD pAS$W0rd pAS$W0rD pAS$W0Rd pAS$W0RD pAS$WOrd pAS$WOrD pAS$WORd pAS$WORD pASSword pASSworD pASSwoRd pASSwoRD pASSw0rd pASSw0rD pASSw0Rd pASSw0RD pASSwOrd pASSwOrD pASSwORd pASSwORD pASSWord pASSWorD pASSWoRd pASSWoRD pASSW0rd pASSW0rD pASSW0Rd pASSW0RD pASSWOrd pASSWOrD pASSWORd pASSWORD Password PassworD PasswoRd PasswoRD Passw0rd Passw0rD Passw0Rd Passw0RD PasswOrd PasswOrD PasswORd PasswORD PassWord PassWorD PassWoRd PassWoRD PassW0rd PassW0rD PassW0Rd PassW0RD PassWOrd PassWOrD PassWORd PassWORD Pas$word Pas$worD Pas$woRd Pas$woRD Pas$w0rd Pas$w0rD Pas$w0Rd Pas$w0RD Pas$wOrd Pas$wOrD Pas$wORd Pas$wORD Pas$Word Pas$WorD Pas$WoRd Pas$WoRD Pas$W0rd Pas$W0rD Pas$W0Rd Pas$W0RD Pas$WOrd Pas$WOrD Pas$WORd Pas$WORD PasSword PasSworD PasSwoRd PasSwoRD PasSw0rd PasSw0rD PasSw0Rd PasSw0RD PasSwOrd PasSwOrD PasSwORd PasSwORD PasSWord PasSWorD PasSWoRd PasSWoRD PasSW0rd PasSW0rD PasSW0Rd PasSW0RD PasSWOrd PasSWOrD PasSWORd PasSWORD Pa$sword Pa$sworD Pa$swoRd Pa$swoRD Pa$sw0rd Pa$sw0rD Pa$sw0Rd Pa$sw0RD Pa$swOrd Pa$swOrD Pa$swORd Pa$swORD Pa$sWord Pa$sWorD Pa$sWoRd Pa$sWoRD Pa$sW0rd Pa$sW0rD Pa$sW0Rd Pa$sW0RD Pa$sWOrd Pa$sWOrD Pa$sWORd Pa$sWORD Pa$$word Pa$$worD Pa$$woRd Pa$$woRD Pa$$w0rd Pa$$w0rD Pa$$w0Rd Pa$$w0RD Pa$$wOrd Pa$$wOrD Pa$$wORd Pa$$wORD Pa$$Word Pa$$WorD Pa$$WoRd Pa$$WoRD Pa$$W0rd Pa$$W0rD Pa$$W0Rd Pa$$W0RD Pa$$WOrd Pa$$WOrD Pa$$WORd Pa$$WORD Pa$Sword Pa$SworD Pa$SwoRd Pa$SwoRD Pa$Sw0rd Pa$Sw0rD Pa$Sw0Rd Pa$Sw0RD Pa$SwOrd Pa$SwOrD Pa$SwORd Pa$SwORD Pa$SWord Pa$SWorD Pa$SWoRd Pa$SWoRD Pa$SW0rd Pa$SW0rD Pa$SW0Rd Pa$SW0RD Pa$SWOrd Pa$SWOrD Pa$SWORd Pa$SWORD PaSsword PaSsworD PaSswoRd PaSswoRD PaSsw0rd PaSsw0rD PaSsw0Rd PaSsw0RD PaSswOrd PaSswOrD PaSswORd PaSswORD PaSsWord PaSsWorD PaSsWoRd PaSsWoRD PaSsW0rd PaSsW0rD PaSsW0Rd PaSsW0RD PaSsWOrd PaSsWOrD PaSsWORd PaSsWORD PaS$word PaS$worD PaS$woRd PaS$woRD PaS$w0rd PaS$w0rD PaS$w0Rd PaS$w0RD PaS$wOrd PaS$wOrD PaS$wORd PaS$wORD PaS$Word PaS$WorD PaS$WoRd PaS$WoRD PaS$W0rd PaS$W0rD PaS$W0Rd PaS$W0RD PaS$WOrd PaS$WOrD PaS$WORd PaS$WORD PaSSword PaSSworD PaSSwoRd PaSSwoRD PaSSw0rd PaSSw0rD PaSSw0Rd PaSSw0RD PaSSwOrd PaSSwOrD PaSSwORd PaSSwORD PaSSWord PaSSWorD PaSSWoRd PaSSWoRD PaSSW0rd PaSSW0rD PaSSW0Rd PaSSW0RD PaSSWOrd PaSSWOrD PaSSWORd PaSSWORD P@ssword P@ssworD P@sswoRd P@sswoRD P@ssw0rd P@ssw0rD P@ssw0Rd P@ssw0RD P@sswOrd P@sswOrD P@sswORd P@sswORD P@ssWord P@ssWorD P@ssWoRd P@ssWoRD P@ssW0rd P@ssW0rD P@ssW0Rd P@ssW0RD P@ssWOrd P@ssWOrD P@ssWORd P@ssWORD P@s$word P@s$worD P@s$woRd P@s$woRD P@s$w0rd P@s$w0rD P@s$w0Rd P@s$w0RD P@s$wOrd P@s$wOrD P@s$wORd P@s$wORD P@s$Word P@s$WorD P@s$WoRd P@s$WoRD P@s$W0rd P@s$W0rD P@s$W0Rd P@s$W0RD P@s$WOrd P@s$WOrD P@s$WORd P@s$WORD P@sSword P@sSworD P@sSwoRd P@sSwoRD P@sSw0rd P@sSw0rD P@sSw0Rd P@sSw0RD P@sSwOrd P@sSwOrD P@sSwORd P@sSwORD P@sSWord P@sSWorD P@sSWoRd P@sSWoRD P@sSW0rd P@sSW0rD P@sSW0Rd P@sSW0RD P@sSWOrd P@sSWOrD P@sSWORd P@sSWORD P@$sword P@$sworD P@$swoRd P@$swoRD P@$sw0rd P@$sw0rD P@$sw0Rd P@$sw0RD P@$swOrd P@$swOrD P@$swORd P@$swORD P@$sWord P@$sWorD P@$sWoRd P@$sWoRD P@$sW0rd P@$sW0rD P@$sW0Rd P@$sW0RD P@$sWOrd P@$sWOrD P@$sWORd P@$sWORD P@$$word P@$$worD P@$$woRd P@$$woRD P@$$w0rd P@$$w0rD P@$$w0Rd P@$$w0RD P@$$wOrd P@$$wOrD P@$$wORd P@$$wORD P@$$Word P@$$WorD P@$$WoRd P@$$WoRD P@$$W0rd P@$$W0rD P@$$W0Rd P@$$W0RD P@$$WOrd P@$$WOrD P@$$WORd P@$$WORD P@$Sword P@$SworD P@$SwoRd P@$SwoRD P@$Sw0rd P@$Sw0rD P@$Sw0Rd P@$Sw0RD P@$SwOrd P@$SwOrD P@$SwORd P@$SwORD P@$SWord P@$SWorD P@$SWoRd P@$SWoRD P@$SW0rd P@$SW0rD P@$SW0Rd P@$SW0RD P@$SWOrd P@$SWOrD P@$SWORd P@$SWORD P@Ssword P@SsworD P@SswoRd P@SswoRD P@Ssw0rd P@Ssw0rD P@Ssw0Rd P@Ssw0RD P@SswOrd P@SswOrD P@SswORd P@SswORD P@SsWord P@SsWorD P@SsWoRd P@SsWoRD P@SsW0rd P@SsW0rD P@SsW0Rd P@SsW0RD P@SsWOrd P@SsWOrD P@SsWORd P@SsWORD P@S$word P@S$worD P@S$woRd P@S$woRD P@S$w0rd P@S$w0rD P@S$w0Rd P@S$w0RD P@S$wOrd P@S$wOrD P@S$wORd P@S$wORD P@S$Word P@S$WorD P@S$WoRd P@S$WoRD P@S$W0rd P@S$W0rD P@S$W0Rd P@S$W0RD P@S$WOrd P@S$WOrD P@S$WORd P@S$WORD P@SSword P@SSworD P@SSwoRd P@SSwoRD P@SSw0rd P@SSw0rD P@SSw0Rd P@SSw0RD P@SSwOrd P@SSwOrD P@SSwORd P@SSwORD P@SSWord P@SSWorD P@SSWoRd P@SSWoRD P@SSW0rd P@SSW0rD P@SSW0Rd P@SSW0RD P@SSWOrd P@SSWOrD P@SSWORd P@SSWORD PAssword PAssworD PAsswoRd PAsswoRD PAssw0rd PAssw0rD PAssw0Rd PAssw0RD PAsswOrd PAsswOrD PAsswORd PAsswORD PAssWord PAssWorD PAssWoRd PAssWoRD PAssW0rd PAssW0rD PAssW0Rd PAssW0RD PAssWOrd PAssWOrD PAssWORd PAssWORD PAs$word PAs$worD PAs$woRd PAs$woRD PAs$w0rd PAs$w0rD PAs$w0Rd PAs$w0RD PAs$wOrd PAs$wOrD PAs$wORd PAs$wORD PAs$Word PAs$WorD PAs$WoRd PAs$WoRD PAs$W0rd PAs$W0rD PAs$W0Rd PAs$W0RD PAs$WOrd PAs$WOrD PAs$WORd PAs$WORD PAsSword PAsSworD PAsSwoRd PAsSwoRD PAsSw0rd PAsSw0rD PAsSw0Rd PAsSw0RD PAsSwOrd PAsSwOrD PAsSwORd PAsSwORD PAsSWord PAsSWorD PAsSWoRd PAsSWoRD PAsSW0rd PAsSW0rD PAsSW0Rd PAsSW0RD PAsSWOrd PAsSWOrD PAsSWORd PAsSWORD PA$sword PA$sworD PA$swoRd PA$swoRD PA$sw0rd PA$sw0rD PA$sw0Rd PA$sw0RD PA$swOrd PA$swOrD PA$swORd PA$swORD PA$sWord PA$sWorD PA$sWoRd PA$sWoRD PA$sW0rd PA$sW0rD PA$sW0Rd PA$sW0RD PA$sWOrd PA$sWOrD PA$sWORd PA$sWORD PA$$word PA$$worD PA$$woRd PA$$woRD PA$$w0rd PA$$w0rD PA$$w0Rd PA$$w0RD PA$$wOrd PA$$wOrD PA$$wORd PA$$wORD PA$$Word PA$$WorD PA$$WoRd PA$$WoRD PA$$W0rd PA$$W0rD PA$$W0Rd PA$$W0RD PA$$WOrd PA$$WOrD PA$$WORd PA$$WORD PA$Sword PA$SworD PA$SwoRd PA$SwoRD PA$Sw0rd PA$Sw0rD PA$Sw0Rd PA$Sw0RD PA$SwOrd PA$SwOrD PA$SwORd PA$SwORD PA$SWord PA$SWorD PA$SWoRd PA$SWoRD PA$SW0rd PA$SW0rD PA$SW0Rd PA$SW0RD PA$SWOrd PA$SWOrD PA$SWORd PA$SWORD PASsword PASsworD PASswoRd PASswoRD PASsw0rd PASsw0rD PASsw0Rd PASsw0RD PASswOrd PASswOrD PASswORd PASswORD PASsWord PASsWorD PASsWoRd PASsWoRD PASsW0rd PASsW0rD PASsW0Rd PASsW0RD PASsWOrd PASsWOrD PASsWORd PASsWORD PAS$word PAS$worD PAS$woRd PAS$woRD PAS$w0rd PAS$w0rD PAS$w0Rd PAS$w0RD PAS$wOrd PAS$wOrD PAS$wORd PAS$wORD PAS$Word PAS$WorD PAS$WoRd PAS$WoRD PAS$W0rd PAS$W0rD PAS$W0Rd PAS$W0RD PAS$WOrd PAS$WOrD PAS$WORd PAS$WORD PASSword PASSworD PASSwoRd PASSwoRD PASSw0rd PASSw0rD PASSw0Rd PASSw0RD PASSwOrd PASSwOrD PASSwORd PASSwORD PASSWord PASSWorD PASSWoRd PASSWoRD PASSW0rd PASSW0rD PASSW0Rd PASSW0RD PASSWOrd PASSWOrD PASSWORd PASSWORD
blacknon@BS-PUB-UBUNTU-01:~$ echo password | sed -e 's/./{\L&,\U&}/g' -e 's/a/{a,@}/g' -e 's/s/{s,\\\\$}/g' -e 's/o/{o,0}/g' | xargs -I@ bash -c 'echo @'
password passworD passwoRd passwoRD passw0rd passw0rD passw0Rd passw0RD passwOrd passwOrD passwORd passwORD passWord passWorD passWoRd passWoRD passW0rd passW0rD passW0Rd passW0RD passWOrd passWOrD passWORd passWORD pas$word pas$worD pas$woRd pas$woRD pas$w0rd pas$w0rD pas$w0Rd pas$w0RD pas$wOrd pas$wOrD pas$wORd pas$wORD pas$Word pas$WorD pas$WoRd pas$WoRD pas$W0rd pas$W0rD pas$W0Rd pas$W0RD pas$WOrd pas$WOrD pas$WORd pas$WORD pasSword pasSworD pasSwoRd pasSwoRD pasSw0rd pasSw0rD pasSw0Rd pasSw0RD pasSwOrd pasSwOrD pasSwORd pasSwORD pasSWord pasSWorD pasSWoRd pasSWoRD pasSW0rd pasSW0rD pasSW0Rd pasSW0RD pasSWOrd pasSWOrD pasSWORd pasSWORD pa$sword pa$sworD pa$swoRd pa$swoRD pa$sw0rd pa$sw0rD pa$sw0Rd pa$sw0RD pa$swOrd pa$swOrD pa$swORd pa$swORD pa$sWord pa$sWorD pa$sWoRd pa$sWoRD pa$sW0rd pa$sW0rD pa$sW0Rd pa$sW0RD pa$sWOrd pa$sWOrD pa$sWORd pa$sWORD pa$$word pa$$worD pa$$woRd pa$$woRD pa$$w0rd pa$$w0rD pa$$w0Rd pa$$w0RD pa$$wOrd pa$$wOrD pa$$wORd pa$$wORD pa$$Word pa$$WorD pa$$WoRd pa$$WoRD pa$$W0rd pa$$W0rD pa$$W0Rd pa$$W0RD pa$$WOrd pa$$WOrD pa$$WORd pa$$WORD pa$Sword pa$SworD pa$SwoRd pa$SwoRD pa$Sw0rd pa$Sw0rD pa$Sw0Rd pa$Sw0RD pa$SwOrd pa$SwOrD pa$SwORd pa$SwORD pa$SWord pa$SWorD pa$SWoRd pa$SWoRD pa$SW0rd pa$SW0rD pa$SW0Rd pa$SW0RD pa$SWOrd pa$SWOrD pa$SWORd pa$SWORD paSsword paSsworD paSswoRd paSswoRD paSsw0rd paSsw0rD paSsw0Rd paSsw0RD paSswOrd paSswOrD paSswORd paSswORD paSsWord paSsWorD paSsWoRd paSsWoRD paSsW0rd paSsW0rD paSsW0Rd paSsW0RD paSsWOrd paSsWOrD paSsWORd paSsWORD paS$word paS$worD paS$woRd paS$woRD paS$w0rd paS$w0rD paS$w0Rd paS$w0RD paS$wOrd paS$wOrD paS$wORd paS$wORD paS$Word paS$WorD paS$WoRd paS$WoRD paS$W0rd paS$W0rD paS$W0Rd paS$W0RD paS$WOrd paS$WOrD paS$WORd paS$WORD paSSword paSSworD paSSwoRd paSSwoRD paSSw0rd paSSw0rD paSSw0Rd paSSw0RD paSSwOrd paSSwOrD paSSwORd paSSwORD paSSWord paSSWorD paSSWoRd paSSWoRD paSSW0rd paSSW0rD paSSW0Rd paSSW0RD paSSWOrd paSSWOrD paSSWORd paSSWORD p@ssword p@ssworD p@sswoRd p@sswoRD p@ssw0rd p@ssw0rD p@ssw0Rd p@ssw0RD p@sswOrd p@sswOrD p@sswORd p@sswORD p@ssWord p@ssWorD p@ssWoRd p@ssWoRD p@ssW0rd p@ssW0rD p@ssW0Rd p@ssW0RD p@ssWOrd p@ssWOrD p@ssWORd p@ssWORD p@s$word p@s$worD p@s$woRd p@s$woRD p@s$w0rd p@s$w0rD p@s$w0Rd p@s$w0RD p@s$wOrd p@s$wOrD p@s$wORd p@s$wORD p@s$Word p@s$WorD p@s$WoRd p@s$WoRD p@s$W0rd p@s$W0rD p@s$W0Rd p@s$W0RD p@s$WOrd p@s$WOrD p@s$WORd p@s$WORD p@sSword p@sSworD p@sSwoRd p@sSwoRD p@sSw0rd p@sSw0rD p@sSw0Rd p@sSw0RD p@sSwOrd p@sSwOrD p@sSwORd p@sSwORD p@sSWord p@sSWorD p@sSWoRd p@sSWoRD p@sSW0rd p@sSW0rD p@sSW0Rd p@sSW0RD p@sSWOrd p@sSWOrD p@sSWORd p@sSWORD p@$sword p@$sworD p@$swoRd p@$swoRD p@$sw0rd p@$sw0rD p@$sw0Rd p@$sw0RD p@$swOrd p@$swOrD p@$swORd p@$swORD p@$sWord p@$sWorD p@$sWoRd p@$sWoRD p@$sW0rd p@$sW0rD p@$sW0Rd p@$sW0RD p@$sWOrd p@$sWOrD p@$sWORd p@$sWORD p@$$word p@$$worD p@$$woRd p@$$woRD p@$$w0rd p@$$w0rD p@$$w0Rd p@$$w0RD p@$$wOrd p@$$wOrD p@$$wORd p@$$wORD p@$$Word p@$$WorD p@$$WoRd p@$$WoRD p@$$W0rd p@$$W0rD p@$$W0Rd p@$$W0RD p@$$WOrd p@$$WOrD p@$$WORd p@$$WORD p@$Sword p@$SworD p@$SwoRd p@$SwoRD p@$Sw0rd p@$Sw0rD p@$Sw0Rd p@$Sw0RD p@$SwOrd p@$SwOrD p@$SwORd p@$SwORD p@$SWord p@$SWorD p@$SWoRd p@$SWoRD p@$SW0rd p@$SW0rD p@$SW0Rd p@$SW0RD p@$SWOrd p@$SWOrD p@$SWORd p@$SWORD p@Ssword p@SsworD p@SswoRd p@SswoRD p@Ssw0rd p@Ssw0rD p@Ssw0Rd p@Ssw0RD p@SswOrd p@SswOrD p@SswORd p@SswORD p@SsWord p@SsWorD p@SsWoRd p@SsWoRD p@SsW0rd p@SsW0rD p@SsW0Rd p@SsW0RD p@SsWOrd p@SsWOrD p@SsWORd p@SsWORD p@S$word p@S$worD p@S$woRd p@S$woRD p@S$w0rd p@S$w0rD p@S$w0Rd p@S$w0RD p@S$wOrd p@S$wOrD p@S$wORd p@S$wORD p@S$Word p@S$WorD p@S$WoRd p@S$WoRD p@S$W0rd p@S$W0rD p@S$W0Rd p@S$W0RD p@S$WOrd p@S$WOrD p@S$WORd p@S$WORD p@SSword p@SSworD p@SSwoRd p@SSwoRD p@SSw0rd p@SSw0rD p@SSw0Rd p@SSw0RD p@SSwOrd p@SSwOrD p@SSwORd p@SSwORD p@SSWord p@SSWorD p@SSWoRd p@SSWoRD p@SSW0rd p@SSW0rD p@SSW0Rd p@SSW0RD p@SSWOrd p@SSWOrD p@SSWORd p@SSWORD pAssword pAssworD pAsswoRd pAsswoRD pAssw0rd pAssw0rD pAssw0Rd pAssw0RD pAsswOrd pAsswOrD pAsswORd pAsswORD pAssWord pAssWorD pAssWoRd pAssWoRD pAssW0rd pAssW0rD pAssW0Rd pAssW0RD pAssWOrd pAssWOrD pAssWORd pAssWORD pAs$word pAs$worD pAs$woRd pAs$woRD pAs$w0rd pAs$w0rD pAs$w0Rd pAs$w0RD pAs$wOrd pAs$wOrD pAs$wORd pAs$wORD pAs$Word pAs$WorD pAs$WoRd pAs$WoRD pAs$W0rd pAs$W0rD pAs$W0Rd pAs$W0RD pAs$WOrd pAs$WOrD pAs$WORd pAs$WORD pAsSword pAsSworD pAsSwoRd pAsSwoRD pAsSw0rd pAsSw0rD pAsSw0Rd pAsSw0RD pAsSwOrd pAsSwOrD pAsSwORd pAsSwORD pAsSWord pAsSWorD pAsSWoRd pAsSWoRD pAsSW0rd pAsSW0rD pAsSW0Rd pAsSW0RD pAsSWOrd pAsSWOrD pAsSWORd pAsSWORD pA$sword pA$sworD pA$swoRd pA$swoRD pA$sw0rd pA$sw0rD pA$sw0Rd pA$sw0RD pA$swOrd pA$swOrD pA$swORd pA$swORD pA$sWord pA$sWorD pA$sWoRd pA$sWoRD pA$sW0rd pA$sW0rD pA$sW0Rd pA$sW0RD pA$sWOrd pA$sWOrD pA$sWORd pA$sWORD pA$$word pA$$worD pA$$woRd pA$$woRD pA$$w0rd pA$$w0rD pA$$w0Rd pA$$w0RD pA$$wOrd pA$$wOrD pA$$wORd pA$$wORD pA$$Word pA$$WorD pA$$WoRd pA$$WoRD pA$$W0rd pA$$W0rD pA$$W0Rd pA$$W0RD pA$$WOrd pA$$WOrD pA$$WORd pA$$WORD pA$Sword pA$SworD pA$SwoRd pA$SwoRD pA$Sw0rd pA$Sw0rD pA$Sw0Rd pA$Sw0RD pA$SwOrd pA$SwOrD pA$SwORd pA$SwORD pA$SWord pA$SWorD pA$SWoRd pA$SWoRD pA$SW0rd pA$SW0rD pA$SW0Rd pA$SW0RD pA$SWOrd pA$SWOrD pA$SWORd pA$SWORD pASsword pASsworD pASswoRd pASswoRD pASsw0rd pASsw0rD pASsw0Rd pASsw0RD pASswOrd pASswOrD pASswORd pASswORD pASsWord pASsWorD pASsWoRd pASsWoRD pASsW0rd pASsW0rD pASsW0Rd pASsW0RD pASsWOrd pASsWOrD pASsWORd pASsWORD pAS$word pAS$worD pAS$woRd pAS$woRD pAS$w0rd pAS$w0rD pAS$w0Rd pAS$w0RD pAS$wOrd pAS$wOrD pAS$wORd pAS$wORD pAS$Word pAS$WorD pAS$WoRd pAS$WoRD pAS$W0rd pAS$W0rD pAS$W0Rd pAS$W0RD pAS$WOrd pAS$WOrD pAS$WORd pAS$WORD pASSword pASSworD pASSwoRd pASSwoRD pASSw0rd pASSw0rD pASSw0Rd pASSw0RD pASSwOrd pASSwOrD pASSwORd pASSwORD pASSWord pASSWorD pASSWoRd pASSWoRD pASSW0rd pASSW0rD pASSW0Rd pASSW0RD pASSWOrd pASSWOrD pASSWORd pASSWORD Password PassworD PasswoRd PasswoRD Passw0rd Passw0rD Passw0Rd Passw0RD PasswOrd PasswOrD PasswORd PasswORD PassWord PassWorD PassWoRd PassWoRD PassW0rd PassW0rD PassW0Rd PassW0RD PassWOrd PassWOrD PassWORd PassWORD Pas$word Pas$worD Pas$woRd Pas$woRD Pas$w0rd Pas$w0rD Pas$w0Rd Pas$w0RD Pas$wOrd Pas$wOrD Pas$wORd Pas$wORD Pas$Word Pas$WorD Pas$WoRd Pas$WoRD Pas$W0rd Pas$W0rD Pas$W0Rd Pas$W0RD Pas$WOrd Pas$WOrD Pas$WORd Pas$WORD PasSword PasSworD PasSwoRd PasSwoRD PasSw0rd PasSw0rD PasSw0Rd PasSw0RD PasSwOrd PasSwOrD PasSwORd PasSwORD PasSWord PasSWorD PasSWoRd PasSWoRD PasSW0rd PasSW0rD PasSW0Rd PasSW0RD PasSWOrd PasSWOrD PasSWORd PasSWORD Pa$sword Pa$sworD Pa$swoRd Pa$swoRD Pa$sw0rd Pa$sw0rD Pa$sw0Rd Pa$sw0RD Pa$swOrd Pa$swOrD Pa$swORd Pa$swORD Pa$sWord Pa$sWorD Pa$sWoRd Pa$sWoRD Pa$sW0rd Pa$sW0rD Pa$sW0Rd Pa$sW0RD Pa$sWOrd Pa$sWOrD Pa$sWORd Pa$sWORD Pa$$word Pa$$worD Pa$$woRd Pa$$woRD Pa$$w0rd Pa$$w0rD Pa$$w0Rd Pa$$w0RD Pa$$wOrd Pa$$wOrD Pa$$wORd Pa$$wORD Pa$$Word Pa$$WorD Pa$$WoRd Pa$$WoRD Pa$$W0rd Pa$$W0rD Pa$$W0Rd Pa$$W0RD Pa$$WOrd Pa$$WOrD Pa$$WORd Pa$$WORD Pa$Sword Pa$SworD Pa$SwoRd Pa$SwoRD Pa$Sw0rd Pa$Sw0rD Pa$Sw0Rd Pa$Sw0RD Pa$SwOrd Pa$SwOrD Pa$SwORd Pa$SwORD Pa$SWord Pa$SWorD Pa$SWoRd Pa$SWoRD Pa$SW0rd Pa$SW0rD Pa$SW0Rd Pa$SW0RD Pa$SWOrd Pa$SWOrD Pa$SWORd Pa$SWORD PaSsword PaSsworD PaSswoRd PaSswoRD PaSsw0rd PaSsw0rD PaSsw0Rd PaSsw0RD PaSswOrd PaSswOrD PaSswORd PaSswORD PaSsWord PaSsWorD PaSsWoRd PaSsWoRD PaSsW0rd PaSsW0rD PaSsW0Rd PaSsW0RD PaSsWOrd PaSsWOrD PaSsWORd PaSsWORD PaS$word PaS$worD PaS$woRd PaS$woRD PaS$w0rd PaS$w0rD PaS$w0Rd PaS$w0RD PaS$wOrd PaS$wOrD PaS$wORd PaS$wORD PaS$Word PaS$WorD PaS$WoRd PaS$WoRD PaS$W0rd PaS$W0rD PaS$W0Rd PaS$W0RD PaS$WOrd PaS$WOrD PaS$WORd PaS$WORD PaSSword PaSSworD PaSSwoRd PaSSwoRD PaSSw0rd PaSSw0rD PaSSw0Rd PaSSw0RD PaSSwOrd PaSSwOrD PaSSwORd PaSSwORD PaSSWord PaSSWorD PaSSWoRd PaSSWoRD PaSSW0rd PaSSW0rD PaSSW0Rd PaSSW0RD PaSSWOrd PaSSWOrD PaSSWORd PaSSWORD P@ssword P@ssworD P@sswoRd P@sswoRD P@ssw0rd P@ssw0rD P@ssw0Rd P@ssw0RD P@sswOrd P@sswOrD P@sswORd P@sswORD P@ssWord P@ssWorD P@ssWoRd P@ssWoRD P@ssW0rd P@ssW0rD P@ssW0Rd P@ssW0RD P@ssWOrd P@ssWOrD P@ssWORd P@ssWORD P@s$word P@s$worD P@s$woRd P@s$woRD P@s$w0rd P@s$w0rD P@s$w0Rd P@s$w0RD P@s$wOrd P@s$wOrD P@s$wORd P@s$wORD P@s$Word P@s$WorD P@s$WoRd P@s$WoRD P@s$W0rd P@s$W0rD P@s$W0Rd P@s$W0RD P@s$WOrd P@s$WOrD P@s$WORd P@s$WORD P@sSword P@sSworD P@sSwoRd P@sSwoRD P@sSw0rd P@sSw0rD P@sSw0Rd P@sSw0RD P@sSwOrd P@sSwOrD P@sSwORd P@sSwORD P@sSWord P@sSWorD P@sSWoRd P@sSWoRD P@sSW0rd P@sSW0rD P@sSW0Rd P@sSW0RD P@sSWOrd P@sSWOrD P@sSWORd P@sSWORD P@$sword P@$sworD P@$swoRd P@$swoRD P@$sw0rd P@$sw0rD P@$sw0Rd P@$sw0RD P@$swOrd P@$swOrD P@$swORd P@$swORD P@$sWord P@$sWorD P@$sWoRd P@$sWoRD P@$sW0rd P@$sW0rD P@$sW0Rd P@$sW0RD P@$sWOrd P@$sWOrD P@$sWORd P@$sWORD P@$$word P@$$worD P@$$woRd P@$$woRD P@$$w0rd P@$$w0rD P@$$w0Rd P@$$w0RD P@$$wOrd P@$$wOrD P@$$wORd P@$$wORD P@$$Word P@$$WorD P@$$WoRd P@$$WoRD P@$$W0rd P@$$W0rD P@$$W0Rd P@$$W0RD P@$$WOrd P@$$WOrD P@$$WORd P@$$WORD P@$Sword P@$SworD P@$SwoRd P@$SwoRD P@$Sw0rd P@$Sw0rD P@$Sw0Rd P@$Sw0RD P@$SwOrd P@$SwOrD P@$SwORd P@$SwORD P@$SWord P@$SWorD P@$SWoRd P@$SWoRD P@$SW0rd P@$SW0rD P@$SW0Rd P@$SW0RD P@$SWOrd P@$SWOrD P@$SWORd P@$SWORD P@Ssword P@SsworD P@SswoRd P@SswoRD P@Ssw0rd P@Ssw0rD P@Ssw0Rd P@Ssw0RD P@SswOrd P@SswOrD P@SswORd P@SswORD P@SsWord P@SsWorD P@SsWoRd P@SsWoRD P@SsW0rd P@SsW0rD P@SsW0Rd P@SsW0RD P@SsWOrd P@SsWOrD P@SsWORd P@SsWORD P@S$word P@S$worD P@S$woRd P@S$woRD P@S$w0rd P@S$w0rD P@S$w0Rd P@S$w0RD P@S$wOrd P@S$wOrD P@S$wORd P@S$wORD P@S$Word P@S$WorD P@S$WoRd P@S$WoRD P@S$W0rd P@S$W0rD P@S$W0Rd P@S$W0RD P@S$WOrd P@S$WOrD P@S$WORd P@S$WORD P@SSword P@SSworD P@SSwoRd P@SSwoRD P@SSw0rd P@SSw0rD P@SSw0Rd P@SSw0RD P@SSwOrd P@SSwOrD P@SSwORd P@SSwORD P@SSWord P@SSWorD P@SSWoRd P@SSWoRD P@SSW0rd P@SSW0rD P@SSW0Rd P@SSW0RD P@SSWOrd P@SSWOrD P@SSWORd P@SSWORD PAssword PAssworD PAsswoRd PAsswoRD PAssw0rd PAssw0rD PAssw0Rd PAssw0RD PAsswOrd PAsswOrD PAsswORd PAsswORD PAssWord PAssWorD PAssWoRd PAssWoRD PAssW0rd PAssW0rD PAssW0Rd PAssW0RD PAssWOrd PAssWOrD PAssWORd PAssWORD PAs$word PAs$worD PAs$woRd PAs$woRD PAs$w0rd PAs$w0rD PAs$w0Rd PAs$w0RD PAs$wOrd PAs$wOrD PAs$wORd PAs$wORD PAs$Word PAs$WorD PAs$WoRd PAs$WoRD PAs$W0rd PAs$W0rD PAs$W0Rd PAs$W0RD PAs$WOrd PAs$WOrD PAs$WORd PAs$WORD PAsSword PAsSworD PAsSwoRd PAsSwoRD PAsSw0rd PAsSw0rD PAsSw0Rd PAsSw0RD PAsSwOrd PAsSwOrD PAsSwORd PAsSwORD PAsSWord PAsSWorD PAsSWoRd PAsSWoRD PAsSW0rd PAsSW0rD PAsSW0Rd PAsSW0RD PAsSWOrd PAsSWOrD PAsSWORd PAsSWORD PA$sword PA$sworD PA$swoRd PA$swoRD PA$sw0rd PA$sw0rD PA$sw0Rd PA$sw0RD PA$swOrd PA$swOrD PA$swORd PA$swORD PA$sWord PA$sWorD PA$sWoRd PA$sWoRD PA$sW0rd PA$sW0rD PA$sW0Rd PA$sW0RD PA$sWOrd PA$sWOrD PA$sWORd PA$sWORD PA$$word PA$$worD PA$$woRd PA$$woRD PA$$w0rd PA$$w0rD PA$$w0Rd PA$$w0RD PA$$wOrd PA$$wOrD PA$$wORd PA$$wORD PA$$Word PA$$WorD PA$$WoRd PA$$WoRD PA$$W0rd PA$$W0rD PA$$W0Rd PA$$W0RD PA$$WOrd PA$$WOrD PA$$WORd PA$$WORD PA$Sword PA$SworD PA$SwoRd PA$SwoRD PA$Sw0rd PA$Sw0rD PA$Sw0Rd PA$Sw0RD PA$SwOrd PA$SwOrD PA$SwORd PA$SwORD PA$SWord PA$SWorD PA$SWoRd PA$SWoRD PA$SW0rd PA$SW0rD PA$SW0Rd PA$SW0RD PA$SWOrd PA$SWOrD PA$SWORd PA$SWORD PASsword PASsworD PASswoRd PASswoRD PASsw0rd PASsw0rD PASsw0Rd PASsw0RD PASswOrd PASswOrD PASswORd PASswORD PASsWord PASsWorD PASsWoRd PASsWoRD PASsW0rd PASsW0rD PASsW0Rd PASsW0RD PASsWOrd PASsWOrD PASsWORd PASsWORD PAS$word PAS$worD PAS$woRd PAS$woRD PAS$w0rd PAS$w0rD PAS$w0Rd PAS$w0RD PAS$wOrd PAS$wOrD PAS$wORd PAS$wORD PAS$Word PAS$WorD PAS$WoRd PAS$WoRD PAS$W0rd PAS$W0rD PAS$W0Rd PAS$W0RD PAS$WOrd PAS$WOrD PAS$WORd PAS$WORD PASSword PASSworD PASSwoRd PASSwoRD PASSw0rd PASSw0rD PASSw0Rd PASSw0RD PASSwOrd PASSwOrD PASSwORd PASSwORD PASSWord PASSWorD PASSWoRd PASSWoRD PASSW0rd PASSW0rD PASSW0Rd PASSW0RD PASSWOrd PASSWOrD PASSWORd PASSWORD

 

処理速度が求められる場合だとあまり使えないかもだけど、ちゃちゃっと単発で出力させたい場合ならコレで良さそうだ。

 

[改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus) [改訂第3版]シェルスクリプト基本リファレンス ──#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

bashでパイプで受け取った値を自動エスケープして出力する

$
0
0

bashで、パイプで渡した値をエスケープした状態で出力させる必要があったので、備忘で残しておく。
sedやawk、printfなどでできる。

sedを使う場合

sed -e 's/[][^$.*?+!\\()&|'\''"]/\\&/g'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | sed -e 's/[][^$.*?+!\\()&|'\''"]/\\&/g'
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!

 

awkを使う場合

awk '{gsub(/[][^$.*?+!\\()&|'\''"]/, "\\\\&", $0);print $0}'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | awk '{gsub(/[][^$.*?+!\\()&|'\''"]/, "\\\\&", $0);print $0}'
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!

printfを使う場合

printfでは、%qで自動エスケープをしてくれる。
標準入力をwhileで受け取ってやり、出力をする。

(while read -r r ;do printf '%q\n' "$r" ;done)
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | (while read -r r ;do printf '%q\n' "$r" ;done)
\'aaaa\&aa#a
b\\bb\"
sx\$sss\!

 

pythonの場合

python -c 'import sys,re; print(re.escape(sys.stdin.read()).rstrip())'
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list
'aaaa&aa#a
b\bb"
sx$sss!
blacknon@BS-PUB-UBUNTU-01:~$ cat test.list | python -c 'import sys,re; print(re.escape(sys.stdin.read()).rstrip())'
\'aaaa\&aa\#a\
b\\bb\"\
sx\$sss\!\

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

第29回シェル芸勉強会に参加してきました(復習)

$
0
0

第29回シェル芸勉強会に行ってきたので、その復習。

今回はちゃんと起きれた(?)ので、午前にも最初から参加することができた。
午前の部はPerlのワンライナー入門とのことで、鳥海さんが講師。使ったスライドはこちら
便利そうな定義済の変数が結構いっぱいあるみたいなので、ちゃんと覚えないとなぁ…。次回はPerlの正規表現になるらしい。

午後はいつもどおり、8個の問題を解いていく。問題・解説はこちら。今回は3つのテーマ(join等によるファイルの結合、パズル、大きい文字を扱った問題)で問題が構成されている。
個人的には、今回は地味にお気に入りのコマンドだったdatamashが地味にハマったのが嬉しかった。

Q1.

2つのファイル「kadai1」「kadai2」を集計して、合計の金額を取得するよ、という問題。
最初の問題だったので、これは比較的時間内に解答しやすかった。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat kadai2
001 山田 20
003 上田 15
004 今泉 22
005 鳥海 44

 

とりあえず、ちゃちゃっとawkでグループ集計を行った。

awk '{s[$1" "$2]+=$3}END{for(i in s){print i,s[i]}}' kadai{1,2} | sort -k1
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ awk '{s[$1" "$2]+=$3}END{for(i in s){print i,s[i]}}' kadai{1,2} | sort -k1
001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

 

後は、datamashで以下のようにすることで集計処理が行える。

cat kadai{1,2} | sort | datamash -t' ' -g 1,2 sum 3
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat kadai{1,2} | sort | datamash -t' ' -g 1,2 sum 3
001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

Q2.

Q2は、既存の講義の出欠データ(attend)に、最新の講義の出席者(attend6)を足して最新の出欠データを作成するという内容。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend6
001,005,003

 

とりあえず、無理やり解いてみた。書き方汚い…。

cat attend6|tr , '\n'|sort -n|sed 's/$/ 出x/g'|join -a1 attend -|sed -e '/x$/!s/$/ 欠x/g' -e 's/x$//g'|awk '{print $1,$2,$3""$4}'
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend6
001,005,003
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend6|tr , '\n'|sort -n|sed 's/$/ 出x/g'|join -a1 attend -|sed -e '/x$/!s/$/ 欠x/g' -e 's/x$//g'|awk '{print $1,$2,$3""$4}'
001 山田 出出欠出出出
002 出川 出出欠欠欠欠
003 上田 出出出出出出
004 今泉 出出出出出欠
005 鳥海 欠出欠出欠出

 

@ebanさんがawk、@grethlenさんがsed単体で解いてたので、以下参考。

Q3.

Q3では、テストの点(test)と出欠データ(attend)を組合せ、出席率が過半数に満たない場合、テストを受けてない場合は0点として集計をする問題(過半数以上出席してテスト受けてれば、その点数が成績になる)。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat test
001 90
002 78
004 80
005 93
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠

 

時間内に解けなかったのだが、とりあえず復習で以下のように出せた。

join -a 1 attend test | awk '{a=$3;if(gsub("出","",a)>2){x=$4}else{x=0};print $1,$2,$3,0+x}'
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ join -a 1 attend test | awk '{a=$3;if(gsub("出","",a)>2){x=$4}else{x=0};print $1,$2,$3,0+x}'
001 山田 出出欠出出 90
002 出川 出出欠欠欠 0
003 上田 出出出出出 0
004 今泉 出出出出出 80
005 鳥海 欠出欠出欠 0

 

あとは、@ebanさんの解答が参考になりそう。午前にやったPerlの三項演算子の書き方、awkでも使えるのかー。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ join -a 1 attend test | awk '{print $1,$2,(gsub("出","",$3)>2?+$4:0)}'
001 山田 90
002 出川 0
003 上田 0
004 今泉 80
005 鳥海 0
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ join -a 1 attend test | awk '{print $1,$2,$3,(gsub("出","",$3)>2?+$4:0)}'
001 山田 出出欠出出 90
002 出川 出出欠欠欠 0
003 上田 出出出出出 0
004 今泉 出出出出出 80
005 鳥海 欠出欠出欠 0

 

【参考】上記コマンドの、awkの三項演算子のトコだけ別のやり方でやってみた

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ # 3列目が30の場合は1、それ以外は2を出力
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat kadai1 | awk '{print ($3==30?1:2)}'
2
1
2

Q4.

Q4.1

以下のように、echoでマイナスを含む数字を出力して、それを同じ桁数のものであれば同じ行に出力させる。

echo -1 4 5 2 42 421 44 311 -9 -11

 

Q4.1に関しては、以下のように awkで記述することで対応できる。

echo -1 4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -n | awk '{x=length($0);if(x!=p)print "";p=x;printf $0" "}'| awk NF
echo -1 4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length($0);printf (x!=p ? "\n" : " ") $0;p=x}'| awk NF #三項演算子を使ったパターン
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ echo -1 4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -n | awk '{x=length($0);if(x!=p)print "";p=x;printf $0" "}'| awk NF
-11
-9 -1
2 4 5
42 44
311 421
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ echo -1 4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length($0);printf (x!=p ? "\n" : " ") $0;p=x}'| awk NF #三項演算子を使ったパターン
-11
-9 -1
2 4 5
42 44
311 421

Q4.2

Q4.2では、Q4.1で扱った数字の一部に+記号が付与された状態で使用する。
ここで知ったのだが、sortで+記号のついた数字を普通の数字としてソートする場合、-gオプションを使用すると良いようだ。

で、後はQ4.1でawkを使って文字の長さを取得する際、数字として取得させれば良いようだ。

echo -1 +4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length(int($0));if(x!=p)print "";p=x;printf $0" "}'| awk NF
echo -1 +4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length(int($0));printf (x!=p ? "\n" : " ") $0;p=x}'| awk NF #三項演算子を使ったパターン
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ echo -1 +4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length(int($0));if(x!=p)print "";p=x;printf $0" "}'| awk NF
-11
-9 -1
2 +4 5
42 44
311 421
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ echo -1 +4 5 2 42 421 44 311 -9 -11 | sed -z 's/ /\n/g' | sort -g | awk '{x=length(int($0));printf (x!=p ? "\n" : " ") $0;p=x}'| awk NF #三項演算子を使ったパターン
-11
-9 -1
2 +4 5
42 44
311 421

Q5.

以下のファイル(triangle)の三角形を、右に回転させてやるという問題。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle
   1
  3 9
 7 a 6
8 4 2 5

 

最初はやり方がわからなかったのだが、試しに行列置換をしてみたところうまくいけた。
rsコマンドでもいけるのだが、今回はdatamashを使って行列置換をして、その後printfでスペース埋めをして反転させることで対処できた。

cat triangle | datamash -t' ' transpose | xargs -d'\n' printf '%-7s\n' | rev
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle
   1
  3 9
 7 a 6
8 4 2 5
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ # datamashで行列置換
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle | datamash -t' ' transpose
   8
  7 4
 3 a 2
1 9 6 5
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ # 右側をスペース埋めするため、xargsでprintfに渡す
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle | datamash -t' ' transpose | xargs -d'\n' printf '%-7s\n' | cat -e
   8   $
  7 4  $
 3 a 2 $
1 9 6 5$
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ # 左右反転させる
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle | datamash -t' ' transpose | xargs -d'\n' printf '%-7s\n' | rev
   8
  4 7
 2 a 3
5 6 9 1

 

ちなみに逆回転(5が一番上に来るやつ)だと、以下のようにコマンドを実行してやることでできた。
ちょっと長くなってしまった…

cat triangle | xargs -d'\n' printf '%-7s\n' | rev | sed 's/\s*$//g' | datamash -t' ' transpose | xargs -d'\n' printf '%-7s\n' | rev
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat triangle | xargs -d'\n' printf '%-7s\n' | rev | sed 's/\s*$//g' | datamash -t' ' transpose | xargs -d'\n' printf '%-7s\n' | rev
   5
  2 6
 4 a 9
8 7 3 1

 

ちなみに、rsコマンド版については@ebanさんが記述してくれていた。
やはり、こちらのほうが短く書けている。

Q6.

Q6では、ファイル(prime)内にある1~100までの範囲内にある素数のうち、欠番の箇所で改行をさせるというもの。

blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ cat prime
2 3 5 7 11 13 17 19 31 37 41 43 47 53 59 67 71 73 79 83 89 97

 

とりあえず、diffでfactorの出力と比較させ、比較時の差異を表す「>」を改行に置換する方法で解答ができる。

diff -y <(cat prime | sed -z 's/ /\n/g') <(echo {1..100} | factor | awk 'NF==2{print $2}') | awk '{gsub(">","\n",$1);printf $1" "}' | awk NF | sed 's/^ //g'
blacknon@BS-PUB-DEVELOP:~/20170701/ShellGeiData/vol.29$ diff -y <(cat prime | sed -z 's/ /\n/g') <(echo {1..100} | factor | awk 'NF==2{print $2}') | awk '{gsub(">","\n",$1);printf $1" "}' | awk NF | sed 's/^ //g'
2 3 5 7 11 13 17 19
31 37 41 43 47 53 59
67 71 73 79 83 89 97

Q7.

toiletコマンドで出力した「にゃーん」という文字列が記述されているhtmlファイルがあるので、それをコンソール上で出力させるという問題。
中身はhtmlファイルなので、CUIブラウザを使うことで対応ができる。もしくは、html2textなるコマンドがあるようなので、それを使うというのも良さそうだ(なお、html2textはTeratermでは動かなかった。表示できない文字コードが使われているようだ)。

w3m -dump ファイルPATH
html2text ファイルPATH

Q8.

shellgeiファイルにある「シェルゲイ」のtoilet出力を、文字詰めして表示させようという問題。
他の人の解答を参考にして、縦横変換をしてスペースしか無い行を削除することで実現。

sed 's/ /_/g;s/./& /g' shellgei|datamash -t' ' transpose|sed -r '/^_( _)+$/d'|datamash -t' ' transpose|sed 's/ //g;s/_/ /g'

 

今回の裏テーマはjoinコマンドだったようなのだが、あまり理解していない事がわかった。
join、もうちょっと使って理解しないとダメだなぁ…。

 

「シェル芸」に効く!AWK処方箋 「シェル芸」に効く!AWK処方箋

nohupで実行させたバックグラウンドジョブ終了時にメールで通知させる

$
0
0

ふと、nohupでバックグラウンドジョブ実行させたジョブについて、終了時にメールやSlackで通知させることができないかと思ったので、ちょっとやってみた。
で、以下のようにすることで、nohupで実行するコマンドを変数に入れて実行・通知させることができるようだ。

(cmd="echo foo{bar,baz}";nohup $cmd && (echo $cmd | mail mail@domain.sample -s "Job finish") > ./cmd &)

コマンド実行時に上記のように実行することで、バックグラウンドジョブ終了時にメールが送信されてくるようになる。
なお、事前にSlackcatの設定やSlackへのポスト用のスクリプトを作っておけば、ジョブ終了時に同様のやり方でSlackへポストさせることが出来るようになる。

 

Linux Command Essential (English Edition) Linux Command Essential (English Edition)

コンソール上でLeet変換された文字列(password→P@ssw0rd)をgrepする

$
0
0

ちょっと前にsedとブレース展開を使ってLeet変換した文字列の一覧を羅列するという処理についてやってたのだが、ふと特定の文字列がLeet変換されている文字列をgrepする場合どうすれば良いのかなと思い調べてみたので、備忘として残しておく。
grepには-fオプション(指定されたファイルの中にある文字列からgrepする)があるので、特に難しいこともなくプロセス置換で実現できる。Leetの組合せは状況に応じて足していけばいい。

grep -i -f <(eval echo $(echo 文字列 | sed -e 's/a/{a,@}/g' -e 's/s/{s,\\\$}/g' -e 's/o/{o,0}/g') | tr ' ' '\n') /tmp/test.txt

blacknon@BS-PUB-DEVELOP:~$ head /tmp/test.txt
password
passwd
P@ssw0rd
10000
10001
10002
10003
10004
10005
10006
blacknon@BS-PUB-DEVELOP:~$ grep -i -f <(eval echo $(echo password | sed -e 's/a/{a,@}/g' -e 's/s/{s,\\\$}/g' -e 's/o/{o,0}/g') | tr ' ' '\n') /tmp/test.txt
password
P@ssw0rd
P@s$w0rd

 

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

joinコマンドで覚えておくと便利な使い方8個

$
0
0

先日のシェル芸勉強会のテーマがjoinコマンドだったのだが、普段あまりjoinコマンドを使ってなかった事もあって、あまりjoinコマンドで解答をできなかったので、使い方について調べなおしてまとめてみることにした。

1.基本的な使い方

joinコマンドは、2つのファイルをSQLのjoinのように結合して表示してくれるというコマンドになる。
以下のように、1列目の形式が同じで順番も揃っている場合、オプションなしで結合をしてくれる。

join file1 file2
blacknon@BS-PUB-DEVELOP:~$ cat test1.a
1 a
2 a
3 a
4 a
5 a
6 a
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ cat test1.b
1 b
2 b
3 b
4 b
5 b
6 b
7 b
8 b
9 b
10 b
blacknon@BS-PUB-DEVELOP:~$ join test1.{a,b}
1 a b
2 a b
3 a b
4 a b
5 a b
6 a b
7 a b
8 a b
9 a b
10 a b

 

この時、joinに使用する列がsortされていないと結合ができない。
このため、結合時はsortと組み合わせるのが基本となるだろう。いちいちエラーメッセージが出てくるのが邪魔であれば「–nocheck-order」オプションを付与するといいだろう。

sort <(sort file1) <(sort file2)
blacknon@BS-PUB-DEVELOP:~$ cat test1.as
3 a
5 a
1 a
10 a
9 a
8 a
2 a
6 a
4 a
7 a
blacknon@BS-PUB-DEVELOP:~$ cat test1.b
1 b
2 b
3 b
4 b
5 b
6 b
7 b
8 b
9 b
10 b
blacknon@BS-PUB-DEVELOP:~$ join test1.{as,b}
3 a b
join: test1.as:3: is not sorted: 1 a
5 a b
join: test1.b:10: is not sorted: 10 b
9 a b
blacknon@BS-PUB-DEVELOP:~$ join <(sort -n test1.as) <(sort -n test1.b)
1 a b
2 a b
3 a b
4 a b
5 a b
6 a b
7 a b
8 a b
9 a b
10 a b

 

ちなみに、オプションなしだと表示されるのは「結合ができた行」のみになる。

blacknon@BS-PUB-DEVELOP:~$ cat test1.a
1 a
2 a
3 a
4 a
5 a
6 a
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ cat test1.bs
3 b
4 b
5 b
6 b
blacknon@BS-PUB-DEVELOP:~$ join --nocheck-order test1.{a,bs}
3 a b
4 a b
5 a b
6 a b4

 

2.区切り文字を切り替える

joinコマンドのデフォルトの区切り文字はスペースとなっているのだが、これをカンマなど任意の文字に切り替わる場合、「-t」オプションで指定できる。

join -t 区切り文字 file1 file 2
blacknon@BS-PUB-DEVELOP:~$ cat test1.a_c
1,a
2,a
3,a
4,a
5,a
6,a
7,a
8,a
9,a
10,a
blacknon@BS-PUB-DEVELOP:~$ cat test1.b_c
1,b
2,b
3,b
4,b
5,b
6,b
7,b
8,b
9,b
10,b
blacknon@BS-PUB-DEVELOP:~$ join -t, test1.{a,b}_c
1,a,b
2,a,b
3,a,b
4,a,b
5,a,b
6,a,b
7,a,b
8,a,b
9,a,b
10,a,be

3.結合に使用する列を指定する

joinコマンドのデフォルトでは、各ファイルで結合に使用する列は1列目を使用するのだが、それを変更する場合は「-1 2」(1ファイル目の2列目)、「-2 3」(2ファイル目の3列目)といった形で結合に使用する列を指定することができる。

join -1 n -2 n file1 file2
blacknon@BS-PUB-DEVELOP:~$ cat test1.a_r
a 1
a 2
a 3
a 4
a 5
a 6
a 7
a 8
a 9
a 10
blacknon@BS-PUB-DEVELOP:~$ cat test1.b
1 b
2 b
3 b
4 b
5 b
6 b
7 b
8 b
9 b
10 b
blacknon@BS-PUB-DEVELOP:~$ join -1 2 -2 1 test1.{a_r,b}
1 a b
2 a b
3 a b
4 a b
5 a b
6 a b
7 a b
8 a b
9 a b
10 a b

4.外部結合(LEFT OUTER JOIN)を行う

joinコマンドでいわゆる外部結合(片方、もしくは両方のファイルで結合できなかった行も表示させる)を行う場合は、「-a 1」(1個目のファイル側の行は全て表示させる)といったオプションを付与してやれば良い。

join -a n file 1 file 2
join -a 1 -a 2 file1 file 2 #両方のファイルで全行表示させる
blacknon@BS-PUB-DEVELOP:~$ cat test1.a
1 a
2 a
3 a
4 a
5 a
6 a
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ cat test1.bs
3 b
4 b
5 b
6 b
blacknon@BS-PUB-DEVELOP:~$ join --nocheck-order -a 1 test1.{a,bs}
1 a
2 a
3 a b
4 a b
5 a b
6 a b
7 a
8 a
9 a
10 a

5.出力する列を指定する

出力する列の順番やどの列を出力するのかを指定する場合、「-o」オプションで指定することができる。
指定方法は、「-o 1.1 1.2 2.3」(1ファイル目の1列目(1.1)、2列目(1.2)と2ファイル目の3列目(2.3))といったように、ドットを使って表現する。

blacknon@BS-PUB-DEVELOP:~$ cat test1.a_n
1 a 1_a
2 a 2_a
3 a 3_a
4 a 4_a
5 a 5_a
6 a 6_a
7 a 7_a
8 a 8_a
9 a 9_a
10 a 10_a
blacknon@BS-PUB-DEVELOP:~$ cat test1.b
1 b
2 b
3 b
4 b
5 b
6 b
7 b
8 b
9 b
10 b
blacknon@BS-PUB-DEVELOP:~$ # 1ファイル目の3列目、2ファイル目の2列目を出力する
blacknon@BS-PUB-DEVELOP:~$ join -o 1.3 2.2 test1.{a_n,b}
1_a b
2_a b
3_a b
4_a b
5_a b
6_a b
7_a b
8_a b
9_a b
10_a b

6.フィールドがない場合に変わりの文字列を入れてやる

結合ができなかったためフィールドの表示ができない場合、通常であれば何も表示されないのだが、「-e 文字列」としてオプションを付与することで、その文字列を変わりに表示してくれるようになる。
-oと組み合わせて使うパターンが多いだろう。

join -e String file1 file2
blacknon@BS-PUB-DEVELOP:~$ join --nocheck-order -a 1 test1.{a,bs}
1 a
2 a
3 a b
4 a b
5 a b
6 a b
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ join -e NULL --nocheck-order -a 1 test1.{a,bs}
1 a
2 a
3 a b
4 a b
5 a b
6 a b
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ join -e NULL --nocheck-order -a 1 -o 1.1 1.2 2.2 test1.{a,bs}
1 a NULL
2 a NULL
3 a b
4 a b
5 a b
6 a b
7 a NULL
8 a NULL
9 a NULL
10 a NULL

7.結合できなかった行のみを出力する

結合が出来なかった行のみを出力する場合、「-v 1」(1ファイル目で結合できなかった行を表示)といったオプションを付与すれば良い。

join -v n file1 file2
blacknon@BS-PUB-DEVELOP:~$ join --nocheck-order -a 1 test1.{a,bs}
1 a
2 a
3 a b
4 a b
5 a b
6 a b
7 a
8 a
9 a
10 a
blacknon@BS-PUB-DEVELOP:~$ join --nocheck-order -v 1 test1.{a,bs}
1 a
2 a
7 a
8 a
9 a
10 a

8.結合時に大文字・小文字を区別させない

結合時に使用する列で大文字・小文字を区別させないようにする場合、「-i」オプションを指定する。

join -i file1 file2
blacknon@BS-PUB-DEVELOP:~$ cat test1.a_r
a_1 1
a_2 2
a_3 3
a_4 4
a_5 5
a_6 6
a_7 7
a_8 8
a_9 9
a_10 10
blacknon@BS-PUB-DEVELOP:~$ cat test1.a_r2
A_1 A
A_2 A
A_3 A
A_4 A
A_5 A
A_6 A
A_7 A
A_8 A
A_9 A
A_10 A
blacknon@BS-PUB-DEVELOP:~$ join -i test1.a_r{,2}
a_1 1 A
a_2 2 A
a_3 3 A
a_4 4 A
a_5 5 A
a_6 6 A
a_7 7 A
a_8 8 A
a_9 9 A
a_10 10 A

 

あなたの知らない超絶技巧プログラミングの世界 あなたの知らない超絶技巧プログラミングの世界

echo、printfでパイプから受けた値を出力する

$
0
0

ちょっとした作業で、「\n」とか「\t」で改行やタブが記述されている内容を、通常どおり改行やタブとして出力させたいということがあり、そのためにechoやprintfに標準入力を渡す必要があった。
で、以下のようにcatと組み合わせることで、echoやprintfにパイプから出力を渡すことができる。

echo "aaa\\tbbb\\nccc\\tddd" | echo -e $(cat)
echo "aaa\\nbbb" | printf $(cat)

[root@BS-PUB-CENT7-01 ~]# echo "aaa\\tbbb\\nccc\\tddd"
aaa\tbbb\nccc\tddd
[root@BS-PUB-CENT7-01 ~]# echo "aaa\\tbbb\\nccc\\tddd" | echo -e $(cat)
aaa     bbb
ccc     ddd
[root@BS-PUB-CENT7-01 ~]# echo "aaa\\tbbb\\nccc\\tddd" | printf $(cat)\\n
aaa     bbb
ccc     ddd

 

ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門 ちょっとだけLinuxにさわってみたい人のための Bash on Ubuntu on Windows入門

Ubuntu Server 16.04 LTS/CentOS 7にtorをインストールしてtor経由でcurlやwgetを使用する

$
0
0

ふと、tor経由でwgetやcurlでWebサーバにアクセスしてみようと思ったので、ちょっとやってみた。まぁ特に難しい事も何もなかったのだけど、とりあえず備忘で残しておく。

1.torのインストール

まずtorのインストール。Ubuntu Server 16.04 LTS/CentOS 7であれば、普通にaptやyum(epel必要だけど)からインストールが可能だ。

●Ubuntuの場合

sudo apt install tor

 

●CentOSの場合

sudo yum install epel-release
sudo yum install tor

 

インストールができたら、Ubuntuであればとりあえずデフォルトの設定でサービスを起動してしまおう(127.0.0.1にしかポート開かないし)。

sudo systemctl start tor
blacknon@BS-PUB-UBUNTU-01:~$ ss -nap | grep :9050
tcp    LISTEN     0      128    127.0.0.1:9050                  *:*
tcp    TIME-WAIT  0      0      127.0.0.1:39180              127.0.0.1:9050

 

これでtorのインストール、起動は完了。

2.tor経由でwgetやcurlを使用する

torのインストール、起動ができたので、torを経由してwgetやcurlを使ってWebサイトにアクセスしてみよう。
torはsocksプロキシとして動作しているので、curlであれば以下のようにすることでtor経由でのアクセスが可能だ。例を見ると、torの再起動に応じてグローバルIPが変わっている事がわかる。

curl -s --socks5-hostname 127.0.0.1:9050 URL
blacknon@BS-PUB-UBUNTU-01:~$ curl -s --socks5-hostname 127.0.0.1:9050 http://inet-ip.info
77.247.181.165
blacknon@BS-PUB-UBUNTU-01:~$ sudo systemctl restart tor
blacknon@BS-PUB-UBUNTU-01:~$ curl -s --socks5-hostname 127.0.0.1:9050 http://inet-ip.info
204.85.191.30
blacknon@BS-PUB-UBUNTU-01:~$ sudo systemctl restart tor
blacknon@BS-PUB-UBUNTU-01:~$ curl -s --socks5-hostname 127.0.0.1:9050 http://inet-ip.info
138.197.207.243

 

curlの場合、このように指定socksをしてやればよいが、既存のスクリプトなどでtor経由での接続をする場合、「torsocks」コマンドもしくは「torify」コマンド経由で呼び出してやることで、簡単にtor経由での通信が行えるようだ。

torsocks コマンド
torify コマンド
blacknon@BS-PUB-UBUNTU-01:~$ cat ./tortest.py
from urllib import urlopen
print(urlopen('http://httpbin.org/ip').read())
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ torsocks python ./tortest.py
{
  "origin": "193.15.16.4"
}

blacknon@BS-PUB-UBUNTU-01:~$ sudo systemctl restart tor
blacknon@BS-PUB-UBUNTU-01:~$ torsocks python ./tortest.py
{
  "origin": "163.172.191.54"
}

blacknon@BS-PUB-UBUNTU-01:~$ torsocks curl http://httpbin.org/ip
{
  "origin": "163.172.191.54"
}

 

結構お手軽に利用できる。

 

ブロッキングPROXY,TOR,VPN: プロキシやTORやVPNによるユーザー投稿をPHPで防ぐ技術 ブロッキングPROXY,TOR,VPN: プロキシやTORやVPNによるユーザー投稿をPHPで防ぐ技術

Pythonでtor経由でスクレイピングを行う

$
0
0

前回、torをUbuntu/CentOSへインストールし利用できるようにしたので、今回はPythonからtor経由でのアクセスを行うようにする。
色々なやり方はあるようなので、2つほど試してみる。

1.requesocksを使う場合

requestsのforkでsocksを使うことができるパッケージがあるので、これで対応するのが楽そうだ。
事前にpipでインストールをしておく。

sudo pip install -U requests[socks]

 

後は、以下のように使用してtor経由でアクセスをすると良い。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests

get = requests.get('http://httpbin.org/ip',
                    proxies=dict(http='socks5://127.0.0.1:9050',
                                 https='socks5://127.0.0.1:9050')).text
print(get)
blacknon@BS-PUB-DEVELOP:~$ cat tortest1.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests

get = requests.get('http://httpbin.org/ip',
                    proxies=dict(http='socks5://127.0.0.1:9050',
                                 https='socks5://127.0.0.1:9050')).text
print(get)
blacknon@BS-PUB-DEVELOP:~$
blacknon@BS-PUB-DEVELOP:~$ python ./tortest1.py
{
  "origin": "51.255.196.218"
}

blacknon@BS-PUB-DEVELOP:~$ sudo systemctl restart tor
blacknon@BS-PUB-DEVELOP:~$ python ./tortest1.py
{
  "origin": "109.163.234.8"
}

blacknon@BS-PUB-DEVELOP:~$ sudo systemctl restart tor
blacknon@BS-PUB-DEVELOP:~$ python ./tortest1.py
{
  "origin": "188.65.144.2"
}

2.Pysocksを使う場合

Pysocksを使う場合、以下のようにする。
(インストールがされていない場合は、事前にpipでインストールをする)

sudo pip insall pysocks
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socks,socket
import urllib2

socks.setdefaultproxy(proxy_type=socks.PROXY_TYPE_SOCKS5, addr='127.0.0.1', port=9050)
socket.socket = socks.socksocket

print(urllib2.urlopen('http://httpbin.org/ip').read())
blacknon@BS-PUB-DEVELOP:~$ cat tortest2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socks,socket
import urllib2

socks.setdefaultproxy(proxy_type=socks.PROXY_TYPE_SOCKS5, addr='127.0.0.1', port=9050)
socket.socket = socks.socksocket

print(urllib2.urlopen('http://httpbin.org/ip').read())
blacknon@BS-PUB-DEVELOP:~$ python tortest2.py
{
  "origin": "89.234.157.254"
}

blacknon@BS-PUB-DEVELOP:~$ sudo systemctl restart tor
blacknon@BS-PUB-DEVELOP:~$ python tortest2.py
{
  "origin": "51.15.53.134"
}

blacknon@BS-PUB-DEVELOP:~$ sudo systemctl restart tor
blacknon@BS-PUB-DEVELOP:~$ python tortest2.py
{
  "origin": "163.172.212.115"
}

 

とりあえずこんな感じだろうか。

 

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド- Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-
Viewing all 498 articles
Browse latest View live




Latest Images