Bo2SS

Bo2SS

回”家“の挨拶 -- SSH接続後のLinuxのフレンドリーな表示

実験環境:Ubuntu18.04 リモートサーバー + WSL2 ローカル

機能要件#

  • 画像

最終成果#

上記の機能を実現した上で、【リアルタイム株価データ、最終ログイン時間、今月の使用時間】を追加し、一定の耐障害性【Shell 判断、API 呼び出し失敗時のデフォルト値返却】を持たせ、いくつかの試すべき機能も追加しました。詳細は文末に【歴史上の今日、拒否された訪問者、最終ログイン時に入力したコマンドの統計、ターミナルでの画像表示】をご覧ください。

画像

  • えっと.. 今日はあまり良い日ではないようです、株式市場は赤字です:)

——> 時間を巻き戻す <——

実現プロセス#

【まずは接続先ホストのデフォルトメッセージを見てみましょう】

画像

  • これらのメッセージは不要です。すべてを最初からやり直し、完全に独自の [あちこちから集めた] メッセージリマインダーを作成します。

起動時の情報を削除#

上記の情報をどうやって削除するのか?

  • 高名な [船長] の指導を受け、「/etc/update-motd.d に行って探してみて」と言われ、vim update-motd.d を表示すると以下のようになります:
    • 画像
    • これはファイルだと思っていましたが... 各ファイルを開くと上記のログイン情報に対応しています。
  • ここで motd は「message of the day」の略で、毎日のメッセージを意味します。
    • 毎回ログイン時に更新されることもあれば、事前に保存されて変わらないこともあります。
    • man 5 update-motd を参照できます。ここではMOTD とは?-cnblogs を参照してください。
    • ここでは、pam というサービスの login モジュールが MOTD の出力を管理していることが述べられています。sudo vim /etc/pam.d/login で motd に関連する機能をコメントアウトしましたが、効果はありませんでした
  • 実は /etc/pam.d/login はローカルログインを制御するためのもので、私は SSH でログインしているため、別の設定ファイル /etc/pam.d/sshd があります。
    • Disable everything in update-motd.d dir in ubuntu server-StackExchange を参照してください。
    • 画像
    • SSH 接続後のログインメッセージを無効にしたいので、sudo vim /etc/pam.d/sshd に入ります。
    • motd に関連する機能をコメントアウトします。
      • 画像
      • update-motd.d の表示メッセージを無効にしたいので、33 行目をコメントアウトします。
      • 静的メッセージのソースである /etc/motd はホスト上に存在しないので、無視して構いません。

【ホストに再接続すると、すっきりしました】

画像

  • しかし、Last login 情報がまだ残っています。
    • これは sshd によって制御されているため、sshd の設定ファイルを見つけます。
    • sudo vim /etc/ssh/sshd_config で PrintLastLog を no に設定します。
    • その後、sshd サービスを再起動して効果を発揮させます。sudo service sshd restart [どこかで見たことがあるような]

【これで、解放前に戻りました】

画像


前準備#

起動時に実行されるファイルを見つける#

【zsh の起動設定ファイルを使用】

Shell:zsh

  • man zsh で FILES を検索し、zsh の起動設定ファイルを確認します。たくさんあります。
  • 画像
  • 文脈に応じて、.zlogin を使用します。
  • ホームディレクトリに.zlogin を作成し、vim ~/.zlogin します。

最近のログイン回数 [今月]#

【今月のログイン:40 回】

画像

【last コマンドで取得】

  • 現在のユーザー
    • who am i の最初の要素を取得:who am i | cut -d " " -f 1
    • USER 環境変数を取得:env | grep USER | cut -d "=" -f 2
  • last でログイン情報を取得→現在のユーザーのログイン情報を検索してカウントします。
last | grep -c `env | grep USER | cut -d "=" -f 2`

[PS] より多くの情報を表示するには、以下を見つける必要があります:

最後の滞在時間 [今月]#

【最後の滞在:01 時間 03 分】

画像

【last コマンドで取得】

  • last でログイン情報を取得→そのユーザーのログイン情報を見つける→「()」形式の接続時間の行をマッチさせる→最近のものを取得→「 ( 」と「) 」で切り取って最後の滞在時間を取得します。
    • 時間形式は時間:分
    • AWK - 正規表現—— 簡単なチュートリアルを参照してください。
last | grep `env | grep USER | cut -d "=" -f 2` | awk '/\(*\)/' | head -1 | cut -d "(" -f 2 | cut -d ")" -f 1

名言の API を探す#

【名言表示】

画像

【出典:名言——Free API】

  • 毎日最大 100 回申請可能
  • curl リクエストを使用:curl https://v1.alapi.cn/api/mingyan
  • 戻り値の形式:json
  • オプションのパラメータ:typeid [1~45]
  • ランダムに取得した json データは以下の通りです:

画像

jqを使用して json データを処理】

  • sudo apt install jq でインストールします。
  • 以下のコマンドを使用します。
curl -s https://v1.alapi.cn/api/mingyan | jq '.data | [.content, .author]' | jq 'join("————")'
  • jq tutorial(簡単な使用法)、jq manual(詳細な操作)を参照してください。
  • また、Shell スクリプトで JSON を処理する—— ブログを参照してください。
    • awk や sed コマンドを使用して異なる json データを処理することもできますが、ここでは強力な jq を使用することでより高い堅牢性を持たせています。

現地の当日の天気予報 API を探す#

【天気表示】

画像

【出典:wttr.in——Github】

  • 一行で出力でき、より簡潔です。
  • カスタムパラメータは以下の通りです:

画像

  • 主に位置、天気アイコン、体感温度、夜の月の形を表示し、以下のコマンドを呼び出します。
curl wttr.in/\?format="%l:+%c+%t+feels+like+%f,+moon+tonight:+%m\n"

温かい挨拶を設定#

【挨拶、ランダムな色】

画像

figletlolcatを使用してアート文字を生成】

  • sudo apt install figlet でインストールできます。
    • [フォントライブラリの拡張]figlet-fonts——Github、git clone 後、すべてのファイルを /usr/share/figlet/ に置きます。
  • showfigfonts "Hey Double" で、Hey Double のすべてのフォントデモを確認できます。
  • figlet のオプションは多く、以下のようになります:
  • 画像
  • 自分の好きなスタイルを選ぶために組み合わせて、私の組み合わせは:figlet -t -r Hey Double -f miniwi です。
  • さらに、lolcat を使用して挨拶に色を付けます:sudo apt install lolcat でインストールできます。
  • 以下のコマンドを使用します。
figlet Hey Double -f miniwi | lolcat
figlet -t -r You\'re back -f miniwi | lolcat

スクリプト作成 [色の最適化を含む]⭐#

~/.login.sh#

画像

画像

画像

  • 【重要】jq、awk、sed の使用にあります。
  • curl が期待通りの結果を返さない場合、保護メカニズムを設けます。
  • 一部の境界や配列、変数の操作については、今後さらに考慮します。
  • ⭐zsh と bash の互換性に注意してください。
    • zsh では、配列のインデックスは 1 から始まり、特殊記号は必ずエスケープする必要があります❗
  • [PS]
    • 追加機能【リアルタイム株価データ、最終ログイン時間、今月の使用時間】は文末に記載されています —— 付録部分。
    • 株価データの appkey と sign は公式サイトで自分のものを生成する必要があります。

.zlogin#

画像

  • ⭐スクリプトを source で呼び出すのではなく、Shell の種類に応じて zsh/bash [デフォルトは bash] を使用します。なぜなら
    • この起動スクリプトは表示のためだけに使用され、環境変数を追加する必要がないからです。
    • zsh/bash を使用すると、サブシェルでスクリプトが実行されますが、source を使用すると現在のシェルで実行され、スクリプト内で追加された変数は環境に反映されます。[set でローカルに定義されたすべての環境変数を確認できます。]

【考察】source と bash でスクリプトを呼び出す違い#

  • bash と source スクリプトの結果は一致せず、前回のテストは bash を使用していましたが、起動スクリプトは source を使用して実行され、現在のシェル ——zsh で実行されます。
  • 起動時の表示は以下の通りです。
  • 画像
  • set -x を使用してスクリプトデバッグを有効にすると、完全なプロセスが表示されます。
    • 画像
    • 左側がコード、右側がデバッグ結果です。
    • index 変数が空になっていることがわかります!
  • 【①】実は zsh と bash の間で、伝説の【配列の開始インデックス】の不一致の問題です。
  • そこで、実行するシェルを判断することを考えました。
  • 【②】配列のインデックス問題が解決されたら、zsh の他の互換性の問題にも注意が必要です。
    • ❗ 特殊記号、ここで jq の後の [] はエスケープ文字 \ が必要です。

【参考】


付録#

グローバル株価指数#

curl http://api.k780.com/\?app=finance.globalindex\&inxids=1010,1011,1013\&appkey=あなたのkey\&sign=あなたのsign | jq .

最後のログイン時間#

  • last
last | grep `env | grep USER | cut -d "=" -f 2` | awk '/\(*\)/' | head -1 | awk '{printf "%s %s %s —— %s", $4, $5, $6, $7}'
  • 改善の余地があり、切り取り方法が硬直しています。

今月の総使用時間#

ac | awk '{print int($NF)}'
  • ac コマンド:ユーザーの接続時間データを表示します。
    • ac はそのユーザーが今月使用した時間を表示します。
    • ac -d はそのユーザーが今月毎日の接続時間を表示します。
    • ac コマンドの詳細——commandnotfound を参照してください。

—— 試すべき ——#

歴史上の今日#

curl http://api.juheapi.com/japi/toh\?key=あなたのkey\&v=1.0\&month=11\&day=1
  • 記録の数をカウントします。
curl -s http://api.juheapi.com/japi/toh\?key=あなたのkey\&v=1.0\&month=1\&day=1 | jq '.result | length'
  • その中の 1 つをランダムに出力します。
    • 0〜N のランダム数を生成します。
$(( ${RANDOM} % ${N} ))

拒否された訪問者の数#

  • 最後のログインから現在まで、何回の失敗したログイン記録があるか。
sudo lastb
  • sudo 権限が必要で、スクリプト内にパスワードを置くのは安全ではありません。

最後のログイン時に入力したコマンドの統計#

【history を使用して統計】

  • 何回コマンドを入力したか。
  • どのコマンドがあなたのお気に入りか。
  • よく間違えるコマンドは何か。

時間がかかると思われます。


参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。