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で出る名称を用いる
シェルスクリプトでパイプを判断する
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'
指定した文字列に当てはまらないもの
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↲
を追加して再起動
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(最初に表示されたファイルを除く)
が良く使われる
lsを日付順で並べ替え
新しい順
ls -t
古い順
ls -tr
まとめてunzip
$ unzip '*.zip'
$ $ find . -name '*.zip' | xargs -I@ unzip @
でおk。かならずシングルクォーテーションで囲むこと。