Linux

SSHで接続できない「Can’t assign requested address」エラーが発生した場合

小ネタです。
なぜか特定のサーバにSSHで接続できない現象が発生しました。他のサーバにはいつも通りに接続でき、DNSやサーバ自体の設定も特に変更していません。

$ ssh ec2-user@example.com -p 10022
ssh: connect to host example.com port 10022: Can't assign requested address

どうやらOpenVPNのクライアントを貧弱なネットワーク環境で使用したり、推奨されない操作をすると「ルーティングテーブル」がぶっ壊れることがちょいちょいあるようです。……思いっきり心当たりがあるw ちょうどこの現象が起こるちょっと前にフリーズしてkill -9 (OpenVPNクライアントのPID)したのでした。

というわけでルーティングテーブルをリセット(flush)します。

$ sudo ifconfig en0 down
$ sudo route flush
$ sudo ifconfig en0 up

これで無事につながるようになりました。めでたしめでたし。

続きを読む

[Linux] yumで一度利用したパッケージをキャッシュする

小ネタです。
AnsibleのPlaybookを作成していたのですが、何度もyumで同じパッケージのインストールを繰り返していると、処理に時間はかかるしネットワーク利用量(利用料)もバカになりません。

そこで一度でも利用したパッケージはローカルにキャッシュするよう設定します。
続きを読む

[Linux] 最低限覚えておきたいTerminalのショートカット一覧

LinuxやmacOSのTerminalのショートカットは様々な物が用意されていますが、一度に全部は覚えられませんw 特におっさんになってくると脳みそが受け付けてくれないのでここでは必要最小限の物をリストアップします。一度覚えてしまえばbashやzshであれば同じ感覚で利用できます。
続きを読む

[Linux] bashで超簡易的な改ざん検知を行いSlackに投げる

小ネタが続いてますが、今回も小ネタですw
Webサイトの改ざん検知を手軽にパパッと行いたい場合、単純にcurlなどで取得したファイルをdiffで比較するだけでも実現できます。

というわけで以下がコード。ここでは最終的にSlackに通知しています。

#!/bin/bash

#
# 簡易的な改ざん検知からのSlack投稿
#

# 対象ページ
TARGET_URL='https://blog.katsubemakito.net/'

# 投稿先のSlack URL
WEB_HOOK_URL='https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxxxxxxxxxxxx'

# 保存先ディレクトリ
STORE_DIR='/home/katsube/'


#-----------------------------------
# 最新のHTMLを取得
#-----------------------------------
cd $STORE_DIR
curl -s $TARGET_URL -o current.html

if [ $? -ne 0 ]; then
  echo "Can not get TARGET_URL: $TARGET_URL" >&2
  exit 1
fi

#-----------------------------------
# 前回のファイルと比較する
#-----------------------------------
if [ -f ./prev1.html ]; then
  result=`diff prev1.html current.html`

  if [ -z ${result} ]; then
    text="変化はありません"
  else
    text="<!channel> 変化がありました"
  fi


  # Slackに投げる
  curl -X POST --data-urlencode "payload={\"text\": \"${text}\"}" $WEB_HOOK_URL

  if [ $? -ne 0 ]; then
    echo "Can not post Slack, diff is ${result}" >&2
    exit 1
  fi
fi

#-----------------------------------
# 今回取得したファイルの名称変更
#-----------------------------------
# 1世代残す
if [ -f ./prev1.html ]; then
  mv prev1.html prev2.html
fi
mv current.html prev1.html

非常に簡易的な物ですので、実際に利用する場合は要件に応じてカスタマイズしてください。
続きを読む

[Linux] Bashでファイル一覧を順番に処理したい

Bashで特定のファイルを順番に処理したい場合、配列をforでぐるぐる回してやるのがお手軽です。ここでは配列listで定義した3つのファイルを順番に指定ディレクトリへコピーしています。

#!/bin/bash

# 対象のファイル一覧
list=(
  /tmp/foo.txt
  /tmp/bar.txt
  /tmp/hoge.txt
);

# 順番に処理する
for file in ${list[@]}; do
  echo "copy ${file} to /home/foo"
  cp $file /home/foo
done

続きを読む

[Linux] Bashでlsやfindの実行結果を1件ずつ処理したい

Bashでlsなどコマンドの実行結果を順番に処理したい場合は以下のようにforでぐるぐる回してやるだけです。

#!/bin/bash

for file in `ls /tmp/*.json`; do
  echo "copy ${file} to /home/foo"
  cp $file /home/foo
done

ここでは「/tmp」ディレクトリ配下にある拡張子が.jsonのファイルを順番に指定ディレクトリへコピーしています。対象のファイルが存在しない場合は何もしません。
続きを読む

[Linux] Bashで一定件数以上のファイルを削除する

日次バッチなどを作っていると、例えばバックアップファイルは最新30件だけ保存し、それ以上古いファイルは削除したいといった気持ちになりますよね。そんな時に利用するのが次のワンライナー。

$ cd backup/
$ rm -f `ls -t . | tail -n+31`

これだと30日前の日付を計算して毎回削除するといった処理を書かなくて済みます。厳密にn日分確保する必要がある場合は日付の計算を行った方が良いでしょうが、念の為一定期間取っておきたいくらいのゆるい要件であれば十分でしょう。

  • 保存しておきたいファイル数に「+1」することをお忘れなく。
  • ディレクトリを削除する場合はrmに-rをつけてください。

続きを読む

[Linux] ファイルの行数や文字数をカウントする – wc

ファイルの文字数や行数を簡単にカウントできるのがwcコマンドです。
恐らく「Word Count」の略称で、ワールドカップでもトイレでもありませんw

以下のように調査したいファイルのパスを渡すと、ファイルの行数、単語数、バイト数を表示してくれます。

$ wc Linux*.md
      45      86    2384 Linuxの使い方.md
     392    1223   12589 Linuxコマンド.md
      17      17     343 Linux上のアカウント.md
     454    1326   15316 total

注意点として、ファイルの文字コードはUTF-8、改行コードをLFにしておくと安全に(正しく)集計が行えます。

続きを読む

[Linux] ディレクトリをツリー状に表示する – tree

今回は以下のようにディレクトリやファイルをツリー状に表示してくれるtreeコマンドです。

$ tree .
.
├── LICENSE.txt
├── README.md
├── bin
│   └── gpwd.js
├── coverage
│   ├── clover.xml
│   ├── coverage-final.json
│   └── lcov.info
├── index.js
├── package-lock.json
├── package.json
└── test
    └── genPassword.test.js

続きを読む

[Linux] yumで特定パッケージのバージョンアップを阻止する

ローカルでの検証用にVirtualBox上でLinuxを動かしているのですが、迂闊にkernelのバージョンを上げてしまうとGustOS用のドライバ(Guest Addition)の再インストールが高確率で発生します。それは良いのですが、問題は再インストールが一発で上手くいった試しがなく、大抵ドハマリして長時間作業が止まる羽目になるんです。

というわけでyum updateの対象にならないよう設定を行います。

設定

以下のように/etc/yum.confに1行書き足せばOK。

$ sudo vi /etc/yum.conf
exclude=kernel*

excludeの横にyumでアップデート対象にしてほしくないパッケージ名を指定するだけです。アスタリスク(*)はワイルドカードを意味し、この場合だとkernel-develなどkernelで始まるものをすべて対象とします。

他に追加したい物があれば、スペースで区切って横に追記してやります。

$ sudo vi /etc/yum.conf
exclude=kernel* php*

続きを読む

[Linux] パスワードを変更する – passwd

Linux上のユーザーのパスワードを変更するにはpasswdコマンドを利用します。

実行例

自分のパスワードを変更する

自分のパスワードを変更する場合、管理者権限(root権限)は不要です。

$ passwd
ユーザー katsube のパスワードを変更。
katsube 用にパスワードを変更中
現在の UNIX パスワード:
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

一般的にUNIX系OSでは入力したパスワードは画面上には表示されません。入力した桁を表現するアスタリスク(*)もです。悪意を持った第三者が背中越しに盗み見る「ショルダーハッキング」を行われた際の防御のためです。

この例のようにpasswdは自分自身のパスワードの変更はもちろんですが、管理者権限(root権限)があれば他のユーザーのパスワードも変更できます。

続きを読む

[Linux] ユーザーを新規作成する – useradd

Linux上にユーザーアカウントを新規に作成するコマンドはuseraddです。

$ sudo useradd -m (ユーザー名)

細かい設定の変更は作成後にいつでも行うことができるので、オプションを指定し忘れた場合は各種設定を行うコマンドを追加で実行すれば大丈夫です。作成したばかりならユーザーを削除してももちろんOKです。

続きを読む

[Linux] ユーザーを削除する – userdel

Linuxで作成済みのユーザーを削除するにはuserdelコマンドを実行するだけです。

$ sudo userdel -r (ユーザー名)

なお特に確認は求められず、Enterキーを押した瞬間削除されますので実行には十分気をつけてください。

続きを読む