目次

Unix :: コマンド / scp

コマンド説明
scpSSHプロトコルを使用して、ホスト間でセキュアにファイルをコピーするためのコマンド


Must be connected to a terminal.

scp でファイルをコピーしようとすると「 Must be connected to a terminal. 」でエラーになる場合の対処方法です。

$ scp hoge@example.com:/path/to/file .
Must be connected to a terminal.


原因

原因は、screen にあります。
相手ホスト(転送元)の .bashrc や .zshrc 等に、何かしらの screen 起動コマンドが記述されていると思いますが、その記述が悪さをしています。
相手ホストは、接続元が scp での接続においても screen を起動しようと試みます。その結果、scp は screen を受け入れることができないのでエラーが発生します。


対処方法

対処方法として、.bashrc の screen 起動コマンドの記述を下記のように変更しました。

if [ "$TERM" != 'screen' ]; then
    screen -xR
fi


if [ "$TERM" != 'screen' -a "$TERM" != 'dumb' ]; then # dumb = scp
    screen -xR
fi

if 文に and 条件として、”$TERM” != 'dumb' を加えました。
dumb は、scp の TERM名なので、 dumb での接続の場合は、screen を起動しない設定になります。
なお、”$TERM” != 'screen' の screen は、screen のTERM名です。
この記述により、screen の重複起動を防いでいます。

screen の -xR オプションについは、下記を参照。
Unix :: コマンド / screen