Corredor

ウェブ、プログラミングの勉強メモ。

GitHub のパスワードを変えたので、パスワード入りで git clone していたリポジトリの設定を修正する

ある日 GitHub を開くと、ページヘッダに「テメェのパスワードは HaveIBeenPwned に登録されてるから変えときな」といったメッセージが表示されていた。「HaveIBeenPwned」というのは、どこかから漏洩したメールアドレスやパスワードの情報をデータベース化しているサイトで、バレやすいパスワードを見極めたりする時に使えるサービスだ。

GitHub はこのサービスを使ってパスワードの弱さをユーザにアナウンスするようになったようだ。

自分が使っていたアカウントの一つでこのメッセージが表示されていたので、パスワードを変更した。コレに合わせて、git clone していたローカルリポジトリの設定を変更しないといけない。自分は、以下の過去記事で紹介している「パスワード入力を省略する方法」を採っていたからだ。

neos21.hatenablog.com

リモート URL の中にユーザ ID とパスワードを組み込んでおくと、git push の時にパスワードを聞かれなくなる、という小技だが、組み込んでおいたパスワード文字列が変わったワケなので、コレを差し替える。

リモート URL は、以下の要領で変更すれば良い。

# まずはカレントディレクトリのリモートリポジトリ URL を確認する
$ git remote -v
origin  https://Neos21:【旧パスワード】@github.com/Neos21/neo.s21.xrea.com.git (fetch)
origin  https://Neos21:【旧パスワード】@github.com/Neos21/neo.s21.xrea.com.git (push)

# 【旧パスワード】部分を【新パスワード】に変えた URL に変更する
$ git remote set-url origin https://Neos21:【新 パスワード】@github.com/Neos21/neo.s21.xrea.com.git

# 正しく反映できたか再確認する
$ git remote -v
origin  https://Neos21:【新パスワード】@github.com/Neos21/neo.s21.xrea.com.git (fetch)
origin  https://Neos21:【新パスワード】@github.com/Neos21/neo.s21.xrea.com.git (push)

こんな感じ。git remote 系のコマンドって叩く機会が少ないから忘れっぽい…。

エンジニアのためのGitの教科書[上級編] Git内部の仕組みを理解する

エンジニアのためのGitの教科書[上級編] Git内部の仕組みを理解する

Mac で Dock をキーボードから操作するには

MacOS High Sierra で確認したが、最近の MacOS なら通用するかと。

MacOS の Dock をキーボードから操作するには、Control + F3。コレで Dock にフォーカスできるので、矢印キーか Tab キーで移動し、Return か Space キーで選択できる。

Control + F3 でフォーカス出来ない場合は、「システム環境変数」→「キーボード」で「F1、F2 などのキーを標準のファンクションキーとして使用」にチェックが入っていないと思われる。この場合は Control + fn + F3 とキー入力すれば良い。

また、英語名のアプリであれば、フォーカス後にアプリ名をタイプすることで、そのアプリをインクリメンタルサーチして選択できる。たとえば「Finder」とか「Google Chrome」などは、「Fi」とか「Goo」あたりまで打てば選択できる。「ターミナル.app」は上手く選択できなかったが…。

知っておくと地味に便利。

Macはじめよう macOS High Sierra対応版

Macはじめよう macOS High Sierra対応版

SSH 接続のパスワード入力を自動化するシェルスクリプトを作ってコマンド化した

MacOS にて実施。

SSH 接続する際、とある理由で公開鍵認証方式が使えず、sshpass という便利なツールも導入できなかったので、他の方法でパスワード入力を自動化する方法を調べた。

expectspawnsend コマンドで作れる!

結論からいうと、以下のようなシェルスクリプトを作れば、SSH 接続とパスワード入力を自動化できる。

#!/bin/sh
 
expect -c "
set timeout 5
spawn ssh -p 22 【ユーザ名】@【接続先 URL】
expect \"Password:\"
send \"【パスワード文字列】\n\"
interact
"
  • expect -c で対話を自動化する。以降のコマンド全体をダブルクォートで囲んでいる
  • set timeout で応答がない場合のタイムアウト秒数を設定する
  • spawn で任意のコマンド入力を再現する
  • spawn 直後の expect で、指定の文言が出力されていることを確認する
    • 今回の場合、ssh コマンド実行後にパスワードを問われる「Password:」という文字列が出力されているかを確認している
    • ダブルクォートは \ でエスケープし、\" と書く
  • send でパスワード文字列の入力を再現している。エンターキーによる改行は \n を付与することで再現する
  • interact でプロセスの制御をユーザに渡し、ユーザからの標準入力を受け付けるようにする

というワケ。

こんなファイルを ~/myssh.sh に保存して、$ sh ~/myssh.sh という風に実行してやれば、自動 SSH ログインできるようになった。

コマンド化する

これだけでもだいぶ楽になったが、毎回 $ sh ~/myssh.sh とタイプするのは面倒だ。そこで、自作コマンドとして動作するようにする。

まずは PATH を確認する。最初から /usr/local/bin などに PATH が通っていると思うのでココに置いても良いが、今回はユーザホームの ~/bin/ 配下に自作コマンドを置きたいので、~/.bash_profile にて PATH を追加する。

# ~/.bash_profile
export PATH=~/bin:$PATH

このようにすると、~/ が展開されてユーザホームのフルパスを示すようになる。

$ echo $PATH
/Users/Neo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

# 最初の「/Users/Neo/bin」がコレ。

編集後は $ . ~/.bash_profile で再読込する (ピリオド .source コマンドと同じ)。

次に、先程作った myssh.sh~/bin/ 配下に移動し、名前を拡張子なしの myssh にリネームする。

リネームできたら、コマンドラインから以下の要領で全ユーザに実行権限を付ける。

$ chmod a+x ~/bin/myssh

ココまでできたら完成。以降は $ myssh と打つだけで自動 SSH ログインできるようになる。やったぜ。

参考文献

sshpass については以下などを参照のこと。

OpenSSH[実践]入門 Software Design plus

OpenSSH[実践]入門 Software Design plus

実用SSH 第2版―セキュアシェル徹底活用ガイド

実用SSH 第2版―セキュアシェル徹底活用ガイド

  • 作者: Daniel J. Barrett,Richard E. Silverman,Robert G. Byrnes,小島肇,坂井順行,鹿田幸治,園田道夫,高橋基信,根津研介,宮本久仁男
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2006/11/22
  • メディア: 大型本
  • 購入: 2人 クリック: 79回
  • この商品を含むブログ (48件) を見る