Date Modified Tags memo

wgetでpost

wget --post-data="hoge=fuga&foo=bar" url

エスケープはこちらでしないといけない。

sshでexpecting SSH2_MSG_KEX_ECDH_REPLYと出てログイン出来ないケース

MTUの値を下げることで対応できる

sudo ip li set mtu 1200 dev {dev}

devにはeth0などifconfigで出る名称を用いる

参考:SSH fails with connection timed out - in VPN and hangs here “expecting SSH2_MSG_KEX_ECDH_REPLY” + Ubuntu 16.04.6 LTS

シェルスクリプトでパイプを判断する

if [ -p /dev/stdin ]; then
//パイプ入力の場合
 cat -
// - が入力
 ...
elif [ -p /dev/stdout ]; then
//パイプの出力寸前の場合
 ...
else
 ...
fi

参考: + シェルスクリプトでパイプを判断する

rsyncで通信をいっぱいいっぱいにしない方法

rsync -a --bwlimit=10000
//10000キロバイト/秒で通信
trickle -s -d 10000
//10000キロバイト/秒でダウンロード。-sはスタンドアロンモード
trickle -s -u 10000
//10000キロバイト/秒でアップロード
rsync --rsh="trickle -d 10000 -u 10000 ssh" SRC DEST
//trickleでrsync

参考: + rsyncコマンドによるバックアップで通信帯域専有を避ける方法 + Trickle

ファイルを空にする

パーミッションや作成者を保存したままファイルを空にしたい

$ cp /dev/null filename
$ : > filename
$ echo -n > filename

nkfを使ってurlエンコード、デコード

urlエンコード

$ echo 'ほげ' | nkf -WwMQ | tr = %

urlデコード

$ echo %E3%81%BB%E3%81%92 | nkf -w --url-input

参考:Linux:コマンドラインでURLエンコード・デコードする(nkf編)

sshでリモートサーバーのフォルダをマウント

sshfsってのを使う。Ubuntuはaptitudeでインストール

$ aptitude install sshfs

MacはFUSE for macOS からFUSE for macOSとSSHFS for macOSをインストールすれば使えるようになる。

マウントは

$ sshfs username@host:path_to_remote_dir path_to_local_dir

でいける

アンマウントは

$ unmount mountpoint #Ubuntu
$ diskutil unmount mountpoint #Mac

参考:

2020-12-19追記

sshfsのスピードアップ?色々オプション付けると良いらしい

sshfs remote:/path/to/folder local -oauto_cache,reconnect,defer_permissions

参考:

sshが切れても標準出力を残す

screenを使うのが無難?

$ screen -S hoge
$ 何かコマンド
$ Ctrl+a c でウィンドウ作成
$ Ctrl+a " でウィンドウ選択
$ screen -ls でxxx.hogeとか出てくる
$ screen -d xxx で元のターミナル?に戻る
$ screen -r xxx でコマンドを行ってるウィンドウに戻る

ファイルのリアルタイム更新状況をチェック

tailとかlessとか使う

$ less +F hoge.log
$ tail -f hoge.log

lessはCtrl+Cで通常のlessに戻る Shift+fでリアルタイム更新チェックに戻る

参考:tail -fやtailfを使うのはやめてless +Fを使おう - Qiita

grepの良く使うオプション

行番号を表示

nオプションを使う

$ cat hoge | grep -n 'hoge'

前後数行を表示

前後3行なら

$ cat hoge | grep -3 'hoge'

参考: grepで該当する行の前後も一緒に表示するには

指定した文字列に当てはまらないもの

vオプションを使う

$ cat hoge | grep -v 'hoge'

出力に行番号を追加

linuxにはnlコマンドがある

hoge.txtの中身をこんな感じに

aaa
bbb
ccc
$ cat hoge.txt | nl nl -s ','
     1,aaa
     2,bbb
     c,ccc

こんな感じ。行頭の空白を消したい場合はsedと組み合わせる

$ cat hoge.txt | nl nl -s ',' | sed 's/^ *//g'
1,aaa
2,bbb
c,ccc

csvっぽく出来る

アクセスログのIPアドレスを集計してみる

参考:Linux サーバーでお手軽にログの集計:こっそりと。 - livedoor Blog(ブログ)

Google Analyticsでリファラ無しの変なアクセスが増えたので、アクセスログからIPを集計してみた。 アクセスログの書式はLTSVでこんな感じ

time:07/Mar/2014:06:25:22 +0900       host::11.22.33.46       forwardedfor:-  req:GET / HTTP/1.1   status:200      size:1       referer:-ua:Mozilla/5.0 (***)      reqtime:0.777   cache:- runtime:-       vhost:hoge.fuga

なんか色々ソフト使うのとか面倒だったのでgrepとかawkでほげほげした。要はhost:11.22.33.44に当たる箇所を取り出して表示回数をまとめれば良い。

$ cat access.log | grep -v -i "bot" | grep "referer:-" | grep "status:200" | awk '{print $3}' | sort | uniq -c

{% include 'includes/ad-content.html' %}↲

軽くbot避けを入れてるけど、crawlerとかspiderとかを避けておくとより正確になるかも。 これだけだと一杯出てくるので100回以上アクセスあったIPだけ取り出してみた。

$ cat access.log | grep -v -i "bot" | grep "referer:-" | grep "status:200" | awk '{print $3}' | sort | uniq -c | grep "[0-9]\{3,\}\s"

ただ、最初の目的には最初の集計の方が役に立った。結局Bingのボットだったみたい。Analyticsではじけなかったアクセスがあったのかな。

大きなファイルを探す

例:100MB以上のファイルを探す

$ find path -size 100M

Windows共有フォルダをマウント

参考:Ubuntu から Windows の共有フォルダをマウントして利用する - Qiitaというかほぼそのまま

$ sudo aptitude install cifs-utils
$ sudo mkdir -p /mnt/windows
$ sudo mount -t cifs -o username=WindowsUsername,password=WindowsPassword //ServerNameOrIp/path/to/share /mnt/windows

ファイルのフルパス一覧を取得

参考:逆引きUNIXコマンド/ファイルのフルパス名を取得する方法 - Linuxと過ごす

単純なlsだとファイル名だけが一覧になるので、フルパスの一覧が欲しい場合は一工夫必要

$ ls -dF /path/to/dir/*
$ find `pwd` -maxdepth 1 -mindepth 1

SSHを使ってリモートでコマンド実行する

単純なコマンド実行

$ ssh username@hostname options... "command"

ローカルのファイルをリダイレクトしてリモートコマンドに使用する。

$ ssh username@hostname options... "command" < localfile

重複行を削除する

$ cat hoge | sort | uniq

参考:[Linux] sort と uniq をパイプでつないで重複行を削除する | CodeNote.net

重複した行だけ取り出し

重複した行全て

aaa
bbb
bbb
ddd

というファイルで

$ uniq -D filename

とすると、

bbb
bbb

が出力される。 ちなみに-dだと

bbb

となる

-uならば

aaa
ccc

となる

grepで該当行前後を表示する

$ cat hoge.txt | grep "fuga" -3 #前後3行
$ cat hoge.txt | grep "fuga" -B 3 #前3行
$ cat hoge.txt | grep "fuga" -A 3 #後3行

sshでポートフォワーディング

例えばPostgreSQLのポート5432をローカルの6542にポートフォワードする場合は

$ ssh -N -f -L 6543:localhost:5432 username@hostname

時刻調整

ntpをインストールする必要はない。Ubuntuの場合、ntpdate-debianコマンドがあればいける。ntpdateコマンドだとエラーが出た。

$ sudo ntpdate
no servers can be used, exiting
$ sudo ntpdate-debian
step time server xxx.xxx.xxx.xxx offset -914.392749 sec

参考:[SOLVED] ntpdate - No Servers

ntpサーバを指定するには/etc/default/ntpdateを変更する

NTP_USE_NTP_CONF=no
NTPSERVERS="ntp.nict.jp"

毎日のcronjobで動作させる

sudo cd /etc/cron.daily
sudo ln -s /etc/network/if-up.d/ntpdate ./ntpdate

でおk 参考:Ubuntu ntpdate 時刻合わせ - ガットポンポコ

windows共有フォルダをマウント

コマンドはこんな感じ

$ sudo aptitude install cifs-utils
$ sudo mount -t cifs -o username=Windowsユーザー名,password=Windowsパスワード,uid=Linuxユーザーid,gid=Linuxグループid //windows ip/path/to/share /mnt/path/to/share

こうしておくとファイルの編集も可能。uidとかgidが無いとrootで共有する。

linux(ubuntu)起動時に共有したい場合、fstabを編集する

//windows ip/path/to/share  /mnt/path/to/share  cifs  credentials=/home/username/.windowscredentials,uid=Linuxユーザーid,gid=Linuxグループid,iocharset=utf8  0  0

上のコマンドみたいにWindowsユーザー名、パスワードを入力してもいけるが、fstabは複数人から見ることが出来るので、ユーザーフォルダ内に認証用のファイルを作ってパスワードを隠す

/home/username/.windowscredentialsを次のようにして600で保存すればおk

username=Windowsユーザー名
password=Windowsパスワード

参考:MountWindowsSharesPermanently - Ubuntu Wiki

LANで利用されているIPアドレスを調べる

arp-scanコマンドを使う。 まずはインストール

$ sudo aptitude install arp-scan

使い方

$ sudo arp-scan -I eth0 -l

eth0はスキャンしたいネットワークアダプタ

csvからカラム切り出し

例としてhoge.csvの2カラム目を取り出す

$ cut -f 2 hoge.csv

この場合タブ区切り、カンマ区切りしたい場合は

$ cut -d , -f 2 hoge.csv

参考:逆引きUNIXコマンド/指定したフィールドを抜き出す - Linuxと過ごす

csvのソート

$ sort --field-separator=',' --key=2

こうやるとカンマ区切りのデータの2番目のカラムでソートしてくれる

数値でソートしたい場合は-nをオプションに加える

逆順の場合は--reverseをオプションに加える

参考:unix - Sort CSV file by column priority using the "sort" command - Stack Overflow

cronjobの一覧

$ crontab -l
$ sudo crontab -l -u username
$ ls /etc/cron.d
$ ls /etc/cron.hourly
$ ls /etc/cron.daily
$ ls /etc/cron.weekly
$ ls /etc/cron.monthly

これくらいチェックすればよさげ

iconvでエラーをスキップ

cオプションを付ければ良い

$ iconv -c -f SJIS -t UTF-8 hoge.txt

ip, gateway, DNSの手動設定

\/etc\/network\/interfaces

を編集する

auto eth0
iface eth0 inet static
address アドレス
netmask 255.255.255.0
gateway ゲートウェイ

dns-namaservers ネームサーバーのアドレス

画像を作成月に応じてフォルダに振り分ける

pythonを使う

import subprocess
import os
import sys
import shutil

#---
save_to = "/targeted/directory"
#---

directory = sys.argv[1]
if not os.path.exists(save_to):
    os.mkdir(save_to)

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")

def check_dir(dr):
    if not os.path.exists(dr):
        os.mkdir(dr)

def rename_dups(target_dir, name):
    n = 1; name_orig = name
    while os.path.exists(target_dir+"/"+name):
        name = "duplicate_"+str(n)+"_"+name_orig
        n = n+1
    return target_dir+"/"+name

for root, dirs, files in os.walk(directory):
    for name in files:
        file = root+"/"+name
        try:
            date = [l for l in get("exif "+'"'+file+'"').splitlines()\
                    if "Dat" in l][0].split("|")[1].split()[0]
            if "-" in date:
                date = date.split("-")[:2]
            elif ":" in date:
                date = date.split(":")[:2]
            targeted_dir = save_to+"/"+date[0]
            check_dir(targeted_dir)
            sub_dir = targeted_dir+"/"+date[1]
        except:
            sub_dir = save_to+"/"+"undetermined"
        check_dir(sub_dir)
        newfile = rename_dups(sub_dir, name)
        shutil.copyfile(file, newfile)

参考 Reorganize photos from an existing folder structure into a new structure

フォルダやファイルを監視して何か変更があれば作業を行う

incronというアプリを使うとcrontabみたいな形で書くことができる。

インストール

sudo aptitude install incron

設定

incrontab -e

書式

<対象パス> <監視する行動> <実行するコマンド>
例:
/path/to/check IN_ACCESS echo "$$ $@ $# $% $&"

実行するコマンドで使える特殊変数は次のとおり

$$ ドルマークを表示
$@ 対象パス
$# 行動のあったファイル名
$% 行動フラグ
$& 行動フラグ(数字)

確認

incrontab -l

監視するパスの権限が合ってないとチェックしてくれません。

参考 + ファイルのアクセスや更新があったときに何かする + How to Use Incron to Monitor Important Files and Folders + incronを使ってみた

Ubuntuのアップデートでネットに繋がらなくなったら

  • ドライバがなくなった
  • インターフェース名が変わった

くらいを確認する

ifconfig -a

でlp以外が出ればインターフェース名が変わった可能性が高い

dmesg | grep eth0

とかでどんなことが起こったか分かると思う

インターフェース名が変わった場合は

/etc/network/interfaces

を編集して再起動すればおk

ドライバがなくなった場合は何とかドライバをインストールする 参考:UbuntuでNICを認識しない場合の対応

Sambaの共有フォルダをマウント

mount -t cifs //<host name or ip>/path /path/to/mount -o user=<username for samba>

自動マウント

/etc/fstabを編集

//<host name or ip>/path /path/to/mount    cifs    username=<username for samba>,password=<password for samba>,uid=<user id>,gid=<group id>    0   0↲

を追加して再起動

参考 :LinuxからSambaをマウントする

cat | grepでBinary file (standard input) matchesが出たら

grep に -aオプションをつけると良い

参考:zgrepやzcat | grepでBinary file (standard input) matchesが出た場合の対処法

ログイン時にzshを使う

which zsh
/usr/bin/zsh
chsh
Changing the login shell for xxx
Enter the new value, or press ENTER for the default
    Login Shell [/path/to/sh]: 
/usr/bin/zsh #と入力

同じ内容のファイルを検出する

fdupsを使う

インストール

sudo aptitude install fdups

実行

fdups <オプション> 対象のフォルダ...

対象のフォルダは複数指定可能 オプションは

  • r(下位フォルダも検索)
  • d(重複ファイルを削除する)
  • f(最初に表示されたファイルを除く)

が良く使われる

参考:Ubuntuで重複ファイルを削除する

lsを日付順で並べ替え

新しい順

ls -t

古い順

ls -tr

参考:lsで日付ファイル名の逆順に並べる並べ方

まとめてunzip

$ unzip '*.zip'
$ $ find . -name '*.zip' | xargs -I@ unzip @

でおk。かならずシングルクォーテーションで囲むこと。

参考:unzipで複数ファイルを一括解凍