TeraTerm の SCP 機能でエラーが発生する場合の対処方法
※ 大昔に Tumblr に書いた記事の転載。元の記事は消したので、こっちに残しておく。
知らない人が多い気がするが、TeraTerm のウィンドウにファイルをドラッグすると、リモートのホームディレクトリにドラッグしたファイルを SCP で転送する機能がある。この機能を使いたかったのだが、なぜか接続先のサーバによって、できたりできなかったりしていた。 できないサーバでは決まって ]0;localhost;/home/sunone・ といったエラーダイアログが出る。永いことエラーの原因を特定できないでいたが、先日 Git で発生した同様のエラーを解決した際に原因を特定した。
要するに、小難しいプロンプトを設定していたせいで、SCP がうまく動作できなかったのが原因だった。解決策は簡単で、端末からのログイン以外には、エスケープシーケンスを含まない単純な PS1 を設定してやればいい。
.bash_profile などで PS1 を設定している箇所を、以下のように書き換える。
code:prompt.sh
if tty >/dev/null 2>&1; then
PS1="\[\0330;33m\\!\if [[ \$? = "0" ]]; then echo "\\[\\033[32m\\]"; else echo "\\[\\033[31m\\]"; fi\`[\u.\h: \`if [[ pwd|wc -c|tr -d " " > 18 ]]; then echo "\\W"; else echo "\\w"; fi\`]\$\[\033[0m\] "; echo -ne "\033]0;hostname -s:pwd`\007" else
PS1='$ '
fi
if 文に指定した tty コマンドは、TeraTerm からの接続であれば、以下のような実行結果になる。 code:terminal
$ tty
/dev/pts/0
一方、ファイル転送時は tty コマンドが失敗する。これは .bash_profile に tty >/tmp/tty.txt 2>&1 を追記して、TeraTerm からファイル転送を行なってみると確認できる。
作成されたファイルを確認すると、以下のようになっている。
code:terminal
$ cat tty.txt
tty ではありません
つまり、今回のような問題を回避するには、 tty コマンドが成功した場合のみ PS1 を小難しいものにすればよい、ということだ。