scpができなくなった時の対処法・bashrc編 †
scpコマンドでファイルを他のサーバにコピーしようとしたとき、パスワードの問い合わせがあるのに、scpによるファイル転送がされない場合、コピー対象となるサーバーの.bashrcを変更・追記しませんでしたか!?
.bashrcに追記した内容・コマンドによっては、scpができなくなります。
以下、当方がscpコマンドができなくなった時の原因と対応を以下に記します。
使用したOSはCentOSになります。
scpができなくなった時の原因 †
当方がscpできなくなった時の現象と原因を以下に記します。
- scpコマンドに-vオプションをつけて動作を確認したが、はっきりした原因がわからず。
- scpをした時に日付が表示されるので、転送先マシン(本資料では、192.168.56.6)の.bashrcファイルを確認してみると、dateコマンドを実行していた。
$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
date
dateコマンドが原因でscpが意図した動作にならなかった。(dateコマンドを削除すればscpコマンドが意図した動作になる。)
- 以下、dateコマンドを転送先マシンの.bashrcから削除し再度、転送元マシンからscpコマンドを実行した出力結果です。
ファイルが転送されているのが確認できます。
[sakura@centos6 ~]$ scp tokyo.dat 192.168.56.6:~/.
sakura@192.168.56.6's password:
tokyo.dat 100% 6 0.0KB/s 00:00
[sakura@centos6 ~]$ echo $?
0
echoコマンドなどによる、出力があるコマンドを利用した場合も同様にscpコマンドが意図した動作になりません。
解決方法 †
以下に解決方法を3つ記述します。
- .bashrcの出力があるコマンドを記述しない。(または出力させない。)
- .bash_profileに記述する。
.bashrcと.bash_profileの違いは以下の資料を参考にしてください。
- bashシェルの場合、SSH_TTY環境変数を利用する
以下、SSH_CLIENT環境変数を利用した場合の例を記述します。
SSH_TTYを使用した例 †
.bashrcで何らかの処理をしたい時、以下のように記述することによりsshとscpの動作を一応別々に記述することができます。
SSH_TTYは、コマンドに割り当てれている端末がセットされます。つまり、端末を持たない場合は何もセットされないことを利用し判別しています。
[sakura@centos6 ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
if [ "$SSH_TTY" != "" ]; then
date
fi
SSH_TTYの環境変数を利用し一応sshとscpを切り分ける記事でした。