Linuxログイン時の「Are you sure you want to proceed?」の解決策

普段使っているUbuntu へのログイン時に,いつからか以下の画面が表示されるようになってしまった。

Are you sure you want to proceed?
ログイン時のエラーメッセージ

現象としては,Ubuntu 16.04のログイン時にこのメッセージが出て,そこで起動が止まってしまう。OKを選択したら,きちんとログインができる。PCの起動時にOKを選択する必要があり手間だった。ただ,そこまで実害を感じなかったので,かれこれ半年ほど原因がわからず放置していた。

しかし,状況が先日変わった。Ubuntu 18.04にアップグレードしたところ,この画面が出てもクリックできずGUIでログインできなくなってしまった。これは無視できないので,重い腰を上げて原因究明に乗り出した。

手始めに既往事例を調査したところ以下がヒットした。

14.04 – “Are you sure you want to proceed?” message on login – Ask Ubuntu

どうやら,ログインシェルが標準出力に出力するとこのエラーが出るようだ。Ubuntuはログイン時に~/.profileの内容を読み込む。このファイルはUnix系OSが共通でログインシェルで読み込むため,シェルの共通設定などをいろいろ書いていた。どうやらこのファイルの記述が原因だった。

ファイルの内容を精査したところ,今回のエラー画面は以下のコードで再現できた。

エラーが発生する~/.profile
set -x
PS1="\$([ \$((COLUMNS - \$(expr \"$USERNAME@$HOST:$\" : '.*'))) -le 20 ] && printf '%s\n' || printf '%s''' )"

上記内容の~/.profileを配置し,ログアウトしてログインすると冒頭に掲載した「Are you sure you want to proceed?」の画面が表示される。Ubuntu 14.04, 16.04, 18.04で再現確認できた。

~/.profile内では,冒頭でset -xコマンドを実行し,それ以降のシェルの実行内容を標準出力に出力させていた。これにより,ログイン時やシェルの起動時に~/.profile内でどこが処理が遅いかを毎回確認していた。

2行目のPS1=はコマンドプロンプトの表示内容の桁数をカウントして,余白が20桁以下の場合に,プロンプトを改行するという処理を実装していた。$HOST:の直後に$(pwd)などを配置するが,エラーの再現には不要だったので省略している。

参考までに,上記ファイルでログインすると以下のメッセージが出力される。

. ~/.profile
++ PS1='$([ $((COLUMNS - $(expr "@:$" : '\''.*'\''))) -le 20 ] &&
	printf '\''%s\n'\'' "" ||
	printf '\''%s'\'''\'''\'' "")'
+++ expr '@:$' : '.*'
++ '[' 77 -le 20 ']'
++ printf %s ''

この現象の気になるところは,ただset -xで標準出力を出すだけであれば,今回のエラー画面は表示されないことだ。

例えば,似たようなコマンドでログイン時に標準出力に出力すると以下の画面が表示される。

set -x
PS1="\$([ \$((COLUMNS - \$(expr \"$USERNAME@$HOST:$\" : '.*'))) -le 20 ] )"

Error found when loading /home/senooken/.profile:
出力内容
As a result the session will not be configured correctly.
You should fix the problem as soon as feasible.
~/.profile内で標準出力へ出力時のエラー画面

よくわからないが,2行目のPS1=の処理が何かまずかったようだ。しかし,原因は不明だった。

解決策は単純だ。単に,ログイン時の~/.profile内では標準出力に出力しないようにすればいいだけだ。もっと具体的にいうと,対話シェル以外では標準出力に出力させなければいい

現在のシェルが対話シェルか非対話シェルかはシェル変数の$-iが入っているかで判定すればいい。シェル変数の$-には,シェル (sh, bashなど) の起動オプションとsetで設定したオプションが入っている。

例えば,今回の場合はset -xコマンドを対話シェルでだけ実行するように,以下の通りに1行修正するだけでいい。

エラーの回避方法
case "$-" in (*i*) set -x;; esac

Linuxは設定次第でわけのわからないエラーが出てしまう。今回の件もそんなに事例は多くはなかった。

解決できるときは,今後のために記録を残していきたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です