Skip to main content

expect

自動ログインマクロというとTeratermマクロを思い浮かべがちだが、un*x の expect コマンドを使うこともできる。

マクロはホームディレクトリ等に保存してchmod 700 しておく。

expect を使ったssh自動ログインbashスクリプトの簡単な例(一部抜粋)

sshで自動ログインだけ考えたら、パスフレーズなしの秘密鍵を使えば済むが、マクロならその後の処理も自動化できる。

expect -c "
spawn ssh ${user}@${addr}
expect {
  \"s password: \" {
  send   \"${pass}\n\"
  }
}
interact
"

exit 0

expect をインタープリタとして使ったtelnet自動ログインスクリプトの簡単な例

#! /usr/bin/expect

set addr "hostname"
set user "username"
set pass "password"

spawn telnet ${addr}
expect {
  "login: "  {
  send "${user}\n"
  expect "Password: "
  send "${pass}\n"
  }
}
interact

archive and compress

compress

gzip

gzip filename
gunzip -lv filename.gz
gunzip filename.gz

gzip -c filename > filename.gz
gunzip -c filename.gz > filename

zless filename.gz

bzip2

bzip2 filename
bunzip2 filename.bz2

bzip2 -c filename > filename.bz2
bunzip2 -c filename.bz2 > filename

bzless filename.bz2

xz

xz filename
unxz filename.xz

xz -c filename > filename.xz
unxz -c filename.xz > filename

xzless filename.xz

Archive

tar

tar cf filename.tar filename.0
tar cf filename.tar dirname
tar tvf filename.tar
tar xv filename.tar [path/to/dir/targetfile]

zip

zip filename.zip filename
zip -r filename.zip dirname
unzip -lv filename.zip
unzip filename.zip [path/to/dir/targetfile]

7zip

7z a filename.7z filename
7z a -r filename.7z dirname
7z l filename.7z
7z x filename.7z [path/to/dir/targetfile]

tarとgzip

GNU版tarが使えない時のtar.gzファイルの圧縮

tar cf - file or dir ... | gzip -c > archive.tar.gz

同じく展開

gzip -cd archive.tar.gz | tar xf -

tar、gzipからbase64でエンコード。デコード・展開の確認

tar cf - file or dir ... | gzip -c | base64 - | base64 -i -d - | gzip -cd | tar tvf -
tar cf - file or dir ... | gzip -c | openssl enc -a | openssl enc -a -d | gzip -cd | tar tvf -

ログがローテートされてgzipで圧縮されると、いちいち展開して読むのがめんどくさい と思ってた。 以下のようなツールがあり、gzipで固められたテキストファイルをいちいち展開せずに処理することができる。超便利。

zcat zgrep zdiff zless

for bzip2

bzcat bzgrep bzdiff bzless

for xz

xzcat xzgrep xzdiff xzless

for zip

zipgrep

tar の圧縮オプション

  • Z: compress (Z)
  • z: gzip (gz)
  • j: bzip2 (bz2)
  • J: xz (xz)

zip

microsoft系osでもおなじみの形式

tarでアーカイブしてzip圧縮。展開の確認

tar cf - file or dir ... | zip - - | funzip | tar tvf -

無圧縮zipアーカイブ

zip -0r archive.zip dirname

暗号化

zip -e archive.zip filename

zipの標準的な暗号化方式は強度が弱い。また、アーカイブヘッダが暗号化されず、ファイル名等は隠匿できない。

  • 一定期間経てば保護する必要がなくなる内容を暗号化する用途であれば問題ない。
  • 見られても困らないファイル名になっているなら問題ない。

ならよいが、そうでなければ下記の対応が必要となる。

  • zipファイルを他のツール(gpg等)で暗号化する。
  • 他のアーカイブツール(7z等)を使う。

7z

zipよりも高い圧縮率をサポート。暗号化方式としてAES256をサポート。アーカイブヘッダの暗号化をサポート。 7zではファイルのuid/gidは保持しない。

(ubuntuのp7zipパッケージに含まれる7zrでは、暗号化できなかった。 p7zip-fullパッケージの7zを使うことで、暗号化することができた。)

7z形式で暗号化して圧縮(アーカイブヘッダも暗号化)。

7z a -t7z -p -mhe=on archive.7z dirname

lコマンドの-sltオプションで、暗号化されているか確認することができる。

7z l -slt archive.7z

ファイルの場合、悪意ある人の手に渡ったら、高性能の計算機で長時間パスワード解析されてしまう。 (キャッシュカードのPINコードのように、一定時間に一定回数失敗したら保護される、ということはない。) 内容が漏れたら困る暗号化ファイルには長いパスワードを使う。

圧縮音声など、さらなる圧縮を望まない場合、zipや7z等ではアーカイブのみで圧縮しないこともできる。

zip -0 ....
7z a -mx=0 ....

sed and awk

簡単な使い方の例を記載する。

sed

2行目以降で、fooをbarに全て置換

sed -e '2,$ s/foo/bar/g' filename

20行目の次に「(タブ)added text」を追加、10行目を削除

sed -e '20i\\tadded text' -e '10d' filename

exprを含まない行だけ表示

sed -ne '/expr/! p' filename

後方参照

df /tmp | grep ^/ | awk '{print $5}' | sed -e 's/\([0-9]\{1,2\}\)%/\1/'

df /tmp | sed -ne 's/.* \([0-9]\{1,2\}\)% .*/\1/ p'

replace CR + LF to LF

sed  -e  's/\r$//' -i.bak textfile
perl -pe 's/\r$//' -i.bak textfile

replace LF to CR + LF

sed  -e  's/$/\r/' -i.bak textfile
perl -pe 's/$/\r/' -i.bak textfile

連続した空白文字をタブに置換

sed  -e   's/\s\s*/\t/g' test
perl -ple 's/\s+/,/g'    test

置換先文字列としてシェル変数を使う。

sed  -e 's/^/'"${foo}"'/' test

削除、挿入、置換を実行するsedスクリプトの例

#! /bin/sed -f

3,5d
8i \
# inserted comment\
inserted line # this is inserted
20 s/^/#/

awk

2行目から3行目までを表示

awk '(NR>=2 && NR<=3) {print $0}' filename

行番号を表示

awk '{printf "%02d: %s\n", NR, $0}' filename

IPv4アドレスの第1オクテットが192のものの第2オクテットを抜き出す

awk -F. '$1~/192/ {print $2}' filename
perl -F"\." -alne '{print $F[1]}' filename

コマンドにシェル変数を使う。

awk '{print '"${foo}"', $1}' test
(fooが2017-08のような文字列だと、数値として扱われて演算結果が表示される)

awk -v var=${foo} '{print var, $1}' test
(こちらの例では、そのようなことはない)

スクリプトファイルにコマンドを記載して実行

awk -f script.awk textfile

下記の場合、shebangとして、#! /path/to/awk -f などと記載

chmod u+x script.awk
./script.awk textfile

行頭に2桁の行番号をつけて出力するawkスクリプト

#! /bin/awk -f

BEGIN{
  print "script begin"
}
{
  printf "%02d: %s\n", NR,$0
}
END {
  print "script end"
}

sqlite

SQLiteはRDBMSのデータベースエンジン。サーバではなくライブラリで、とても小さく軽量。

ここでは コマンドラインインタフェース sqlite3 の利用について記載する。

データベースファイルを指定して起動

sqlite3 database.db
-column 左寄せのカラム形式で表示
-header 列の見出しを表示

コマンドラインでSQL実行

sqlite3 database.db 'SELECT count(*) FROM mytable;'

echo 'SELECT count(*) FROM mytable;' | sqlite3 database.db

cat << quit | sqlite3 database.db
SELECT count(*) FROM mytable;
quit

sqlite3 database.db < filename.sql

主なメタコマンド

データベースファイルの確認

.databases

存在する表の確認

.tables

表のDDLの確認

.schema

表のインデックス名の確認

.indices 表名

DDLとデータ内容をSQLでダンプ

.dump [表名]
表名を省略すると全てのテーブルが対象。

ファイルに記載されたSQLを実行

.read ファイル名

CSV形式で表示

.header on
.mode csv
.output ファイル名
SELECT * FROM ...;
.output stdout

CSVファイルの内容を表へインポート

.import database.csv mytable

データベース全体のダンプとリストア

sqlite3 database.db .dump | gzip -c > database.dump.gz
zcat database.dump.gz | sqlite3 database_test.db
(ダンプはSQLなので、sqlite以外の環境へもリストア可能)

バックアップとリストア

cat >> test1.sql << END
SELECT count(*) FROM test;
.backup tmp.backup
DROP TABLE test;
SELECT count(*) FROM test;
.restore tmp.backup
SELECT count(*) FROM test;
END

dump sqlite3 and import to postgresql

$ sqlite3 database_test.db << quit
> .output dump.sql
> .dump
> quit
$ sed -i.bak -e '/^PRAGMA/ s/^/-- /' dump.sql
$ sudo docker run --rm -e POSTGRES_PASSWORD=mypassword -p 5432:5432 -d postgres:alpine
    $ sudo docker exec -i xxxxx psql -U postgres << quit
> CREATE USER dbuser;
> CREATE DATABASE dbuser;
> ALTER ROLE dbuser WITH PASSWORD 'dbuserpassword';
> GRANT ALL PRIVILEGES ON DABABASE dbuser TO dbuser;
> ALTER DATABASE dbuser OWNER TO dbuser;
    > quit
$ cat dump.sql | sudo docker exec -i xxxx psql -U dbuser

PostgreSQL on CentOS7

install

yum install postgresql-server
systemctl list-unit-files  -t service
systemctl is-enabled postgresql.service

start daemon

systemctl status postgresql.service
postgresql-setup initdb
systemctl start postgresql.service
su - postgres
psql -l

sql command operation

psql << END
\du
\q
END
psql -c "select * from pg_user"

create and drop user

\du
SELECT * FROM pg_user;
createuser -P ossdb
dropuser -i ossdb
CREATE USER ossdb LOGIN PASSWORD 'password';
DROP USER IF EXISTS ossdb;

create and drop database

\l
SELECT * FROM pg_database;
createdb -O ossdb -W ossdb
dropdb -i ossdb
CREATE DATABASE ossdb OWNER ossdb;
DROP DATABASE IF EXISTS ossdb;

connect

cat << END >> /var/lib/pgsql/data/pg_hba.conf
host    ossdb           ossdb           127.0.0.1/32            md5
END
systemctl reload postgresql.service
psql -U ossdb -d ossdb -h 127.0.0.1

create and drop table

\dit
\d table_name
CREATE TABLE t1 (
c1 integer,
c2 date,
c3 time,
c4 character,
c5 character varying(16),
c6 real,
primary key (c1), 
unique (c2, c3)
);
DROP TABLE IF EXISTS  t1;

nfs

$ service nfs-kernel-server status
nfsd running

$ service rpcbind status
rpcbind start/running, process xxx

$ rpcinfo -p <hostname>

export infomation

$ showmount -e
Export list for xxxxxx:
/mnt  192.168.1.2

client information

$ showmount -a
All mount points on yyyyyy:
192.168.1.1:/mnt
192.168.1.2:/mnt

allow

$ vi /etc/hosts.allow
portmap : 192.168.1.0/255.255.255.0

kvm virtualization

qcow2 イメージ

作成。

qemu-img create -f qcow2 image.qcow2 xxG

シュリンク。仮想マシンを止めて実行する。

mv image.qcow2 image.qcow2.bak
qemu-img convert -O qcow2  image.qcow2.bak image.qcow2

qemu-kvm コマンドのよく使うオプション

cdイメージから起動

-cdrom image.iso -boot d

cpuとメモリの指定

-smp 2 -m 2048

kvmでwindows10を使用する時、私の環境(Core i5 650)だと下記のように指定することで、cpu負荷が落ち着いた。

-cpu core2duo,+lahf_lm

その後、試行錯誤し、現在は下記の通り指定している。

-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time

(仮想)ストレージの指定。準仮想化ドライバを利用すると、スループットが上がるらしい。 (Windows等で利用する場合は、仮想マシン上でドライバを入れる必要がある。)

-drive if=virtio,file=image.qcow2

ネットワークインターフェースの指定(従来方式)

-net nic,macaddr=xx:xx:xx:xx:xx:xx,model=virtio
-net tap,ifname=vnet0

vncコンソールとキーマップの指定。

-vnc 192.168.xx.xx:xx -k ja

コンソールのマウスカーソルの位置がずれるときは以下を指定 (WindowsではCPU負荷が高くなるらしい)

-usbdevice tablet

デーモンとして起動

-daemonize

物理デバイスのパススルー

example

boot ultra lite linux distribution microcore linux for network configure test

kvm -drive if=virtio,file=linux-microcore-6.4.img -netdev tap,id=tap0 -device e1000,netdev=tap0,mac=52:54:00:12:34:56

openssh

openssh関連ツールについて。

ssh 鍵ペアの作成

ED25519を使うには比較的新しい環境が必要となる(TeraTerm、PuTTyでは既に対応済み) 鍵作成時に鍵長は指定できない(256ビット)。 (ssl証明書ではまだed25519に対応してない模様。ECDSAを使わないならRSAを使わざるをえない。)

ssh-keygen -t ed25519
ssh-keygen -l -f ~/.ssh/id_ed25519

sshサーバへ、公開鍵を転送

cat ~/.ssh/<pubkey> | ssh user@host 'cat >> ~/.ssh/authorized_keys'

known_hostsに登録されているsshサーバ公開鍵の確認と削除

ssh-keygen -F distname
ssh-keygen -R distname

recreate public key from private key

Once create pem format public key from private key. Then import it and output as openssh format key.

$ ssh-keygen -e -f id_rsa.testkey > id_rsa.testkey.pub.pem
$ ssh-keygen -i -f id_rsa.testkey.pub.pem > id_rsa.testkey.pub

接続時のオプション

ssh host
-l user
-v vervose messages
-i private key
-p port
-X # allow x11 forwarding
-L localport:remotehost:remoteport # local port forwarding
-R localport:remotehost:remoteport # remote port forwarding

example of port forwarding

local port forwarding to access remote rdphost
$ ssh username@remotehost -L 13389:rdphost:3389
$ freerdp /v:127.0.0.1:13389

remote port forwarding to allow rdp access
<localhost >$ ssh username@remotehost -R 13389:rdphost:3389
<remotehost>$ freerdp /v:127.0.0.1:13389

ssh ca

create ca certificate

$ ssh-keygen -t ed25519 -f ca.key

make client certificate (sign client public key with ca key)

$ ssh-keygen -s ca.key -I certificate-test -n username id_rsa.pub
$ ssh-keygen -L -f id_rsa-cert.pub

send public ca key to ssh server

$ scp -p ca.key.pub username@remotehost:/home/username

$ sudo mv ca.key.pub /etc/ssh/ca.key.pub
$ sudo chown root:root /etc/ssh/ca.key.pub
$ echo "TrustedUserCAKeys /etc/ssh/ca.key.pub" | sudo tee -a /etc/ssh/sshd_config

make host certificate (sign host public key with ca key)

$ scp -p username@remotehost:/etc/ssh/ssh_host_ed25519_key.pub ssh_host_ed25519_key.pub

$ ssh-keygen -s ca.key -h -I certificate-test ssh_host_ed25519_key.pub
$ ssh-keygen -L -f ssh_host_ed25519_key-cert.pub

send host certificate back to ssh server

$ scp -p ssh_host_ed25519_key-cert.pub username@remotehost:/home/username/ssh_host_ed25519_key-cert.pub

$ sudo mv ssh_host_ed25519_key-cert.pub /etc/ssh/ssh_host_ed25519_key-cert.pub
$ sudo chown root:root /etc/ssh/ssh_host_ed25519_key-cert.pub
$ echo "HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub" | sudo tee -a /etc/ssh/sshd_config

$ service sshd restart

add public key to known host

$ cat << EOF >> ~/.ssh/known_hosts
> @cert-authority *.example.com ssh-ed25519 ...(content of ca.key.pub)...
> EOF

.ssh/config

.ssh/config ファイルにあらかじめ設定を書いておけば、接続のたびにコマンドでいろいろ引数指定しなくてすむ。

以下の例の場合、ssh myalias と実行すれば ssh -l username -p 2222 -i ~/.ssh/I'd_RSA.foo my.example.com で接続できる。

ワイルドカード指定もできる。 以下の例の場合、*.example.net へ ssh するとき、 秘密鍵として ~/.ssh/id_rsa.bar が使われる。

Host myalias
    HostName my.example.com
    User username
    Port 2222
    IdentityFile ~/.ssh/id_rsa.foo
Host *.example.net
    IdentityFile ~/.ssh/id_rsa.bar

ms windows commands

カレントディレクトリの*txtに対して処理を繰り返して実行する

for /r . %i in (*txt) do type "%i" | sort
    バッチの中では%%のようにする。
    doの中の%iは、半角スペースを含むファイル名に展開される場合、ダブルクォーテーションで挟む。
    doの中にパイプを含むことができる。

複数のファイルを、指定したディレクトリに問い合わせ無しでコピーする。

xcopy /y *.txt distdir

ファイルのハッシュ値表示

certutil -hashfile ファイル名 [MD5|SHA1|SHA256]

base64エンコード/デコード

certutil -encode infile file.b64
    エンコードすると、pem形式のファイル(ヘッダ・フッタあり)が得られる。
certutil -decode file.b64 outfile
    デコードするファイルは、pem形式ではないものでOK。

シンボリックリンクの作成

コマンドプロンプトを「管理者で実行」で開いて実行
ディレクトリのリンクの作成と削除
mklink /d <link> <original>
rmdir <link>

共有ドライブのマウント、アンマウント

net use y:
net use y: \\server\share
永続設定 
net use y: \\server\share\dir /persistent:yes
net use y: /delete

date変数の部分文字列を切り出す例

set YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%

その他稀にしか使わないけど便利なコマンド

画面解像度

desk.cpl

ネットワーク接続

ncpa.cpl

送るメニューを開く

start shell:sendto

スタートアップを開く

start shell:startup

IME2010ユーザ辞書ツール

C:\Program Files\Common Files\microsoft shared\IME14\IMEJP\IMJPDCT.EXE

時刻同期

w32tm /query /status /verbose

ディレクトリバックアップバッチ例

if exist z:\. net use z: /delete
if not exist z:\. net use z: \\backupserver\backupvol
set logfile=c:\log\copyall.log
xcopy \usr z:\usr\ /D /E /H /C /Y /R >> %logfile%

CentOS7 basic operation

パッケージ更新

uname -a
yum check-update
yum update

chronyの設定

yum list chrony
ls -l /etc/chrony.conf*
cp -pi /etc/chrony.conf /etc/chrony.conf.000
ls -l /etc/chrony.conf*
diff -u /etc/chrony.conf{,.000}

systemctl status chronyd.service
ps -ef | grep chronyd | grep -v grep
chronyc sources
chronyc tracking
chronyc sourcestats
chronyc -a makestep

systemctl restart chronyd.service

サービスの自動起動設定と解除

systemctl list-unit-files  -t service
systemctl is-enabled chronyd.service

systemctl disable chronyd.service
systemctl enable chronyd.service

パッケージ削除と確認

yum remove chrony
yum list chrony

パッケージ導入

yum install ntp
yum list ntp

サービス起動

systemctl status ntpd.service
systemctl start ntpd.service