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

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

$ aptitude install sshfs

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

マウントは

$ sshfs [email protected]:path_to_remote_dir path_to_local_dir

でいける

アンマウントは

$ unmount mountpoint #Ubuntu
$ diskutil unmount mountpoint #Mac

参考:

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っぽく出来る

sedで良く使うメモ

sedはすぐ忘れる。

参考: + sed コマンド + sedコマンドで覚えておきたい使い方12個(+3個)

置換(文字列削除にも使える)

$ sed 's/正規表現/置換文字列/g'

行削除

$ sed '/正規表現/d'

指定行だけ表示

文字列の編集じゃないけど、便利。

$ sed -n 行番号p
$ sed -n 開始行番号,終了行番号p

アクセスログの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 [email protected] options... "command"

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

$ ssh [email protected] options... "command" < localfile

重複行を削除する

$ cat hoge | sort | uniq

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

文字列置換(sed)関連

一番最初にマッチしたものを置換

$ sed 1,/pattern/s/pattern/replace/

1は1行目からの意味。10行目から始めたければ10に変えるとか、数字はパターンにしても良い

$ sed /pattern from/,/pattern/s/pattern/replace/

一行目に文字列を追加する

$ sed -i hoge -e "1i fuga"

参考: sedにて一番最初にマッチしたモノだけを置換するには - 計算機と戯れる日々

ファイルを上書き保存

オプション -iを使う。一括でファイル上書きならこんな感じ

$ find . -name "*.html" | xargs sed -i -e s/hoge/fuga/

参考: sedでファイルを上書き保存

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 [email protected]

時刻調整

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 "$$ [email protected] $# $% $&"

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

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

確認

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で重複ファイルを削除する

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

sshでUbuntuにログインする時にパスワード入力のところで固まりやすくなる場合の対処

Ubuntuの場合のみ

sshでログインする時に、/etc/update-motd.d にある処理を行うようになっている。ここのファイルで必要の無いものを消すか

/etc/pam.d/sshdで

session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate

をコメントアウトするとupdate-motd.dの処理を行わなくなる。

/etc/hosts $HOME/.ssh/config /etc/resolv.conf

をいじってもダメな場合は試してみると良い

参考: + Ubuntu ログイン時のMotDを止める + Ubuntuでmotdメッセージをいじる + Long wait time on login + sshの接続確立が遅い場合の対処方法 + sshの接続(ログイン時)に時間がかかる