ssh,sftp,scp時のログインシェル、インタラクティブシェル
スクリプトやツールを使用する際、ログインシェルか、インタラクティブシェルかを考慮しないといけないことがあります。
本記事では、ssh、sftp、scpでサーバにログインした際に起動されるシェルがログインシェルかどうか、インタラクティブシェルかどうかについてまとめます。
本記事の目的
ssh、sftp、scpを実行した際に起動されるシェルがログインシェルかどうか、インタラクティブシェルかどうかを確認する
基本
前提
対象はbash(GNU Bash)、ssh、sftp、scpあたりのコマンドと、WinSCPです。
記載されている動作確認結果はRHEL8系のものです。別のOSやLinuxディストリビューションについては、コマンド自体の違いは無いか、あっても少ないはずですが、関連するStartup Files(profileやbashrc等)の構成が違うことより結果的に異なる動作になる場合があります。
ssh、sftp、scp時のログインシェル、インタラクティブシェル
以下のようになります。
一般的なssh関連アクセスと、WinSCPによるアクセスに分けて記載します。
一般的なssh関連アクセス
| コマンド | ログインシェル | インタラクティブシェル |
|---|---|---|
ssh |
||
sftp |
||
scp |
●:該当
“一般的なssh,sftp,scp”と記載したのは、OpenSSHのクライアント機能や、sshについてはWindows上のターミナルソフト(PuTTY、Teraterm)を想定したものです。
一方で、WinSCPのsftp、scpによるアクセスは少し異なるため、後述します。
WinSCPによるsftp、scpアクセス
| コマンド | ログインシェル | インタラクティブシェル |
|---|---|---|
sftp |
||
scp(※1) |
●:該当
(※1)WinSCPのシェル設定が”デフォルト”の場合です。
WinSCPの場合は、内部的にはscp時にログインシェルが起動します。
詳細
sftp,scp時のログインシェル、インタラクティブシェルの確認方法
sftp、scp経由のアクセス時に、ログインシェル、インタラクティブシェルかどうかを確認する方法をメモしておきます。
※これらのアクセス時には、対話的なシェル環境が無いので以下のような方法を使います。
/etc/profileと/etc/bashrc、それぞれの冒頭に以下を追記します。
shopt > ~/shopt.txt echo $- > ~/if_intr.txt
上記設定により、次回以降のログイン時にそれぞれのファイルが読み込まれると、そのユーザのホームディレクトリ配下にshopt、echo $-の結果が記録されますので、そこからログインシェル、インタラクティブシェルかどうかを確認できます。
読み込まれなかった場合は、ファイルが作成されません。
shoptについては、ログインシェルかどうかの確認だけであればshopt -q login_shellだけでも良いです。
shopt以外に、echo $0 > ~/d0.txtのように$0の内容を記録することもできます。
shoptやecho $-の結果の見方については、別記事でログインシェル、インタラクティブシェルの見分け方(bash)にまとめてあります。
sftp時の確認例
sftpでのアクセス時は、以下のようになります。
(WinSCPかどうかに関わらず同じ結果)
-
shoptの結果
“login_shell off” ※非ログインシェル
-
echo $-の結果
“hBc” ※”i”が無いので非インタラクティブ -
(参考)
echo $0の結果
“bash” ※bashは起動されている
scp時の確認例
scpでのアクセス時は、以下のようになります(環境と設定により違います)。
scp:WinSCPの場合(シェル設定が"デフォルト"時)
前述の表のとおりです。
-
shoptの結果
“login_shell on” ※ログインシェル
-
echo $-の結果
“hB” ※”i”が無いので非インタラクティブ
-
(参考)
echo $0の結果
“-bash” ※argv[0]の先頭が”-“なのでログインシェル
scp:WinSCPの場合(シェル設定が"/bin/bash"時)
これは前述の表にはないパターンです。非ログインシェルになります。
-
shoptの結果
“login_shell off” ※非ログインシェル
-
echo $-の結果
“hBc” ※”i”が無いので非インタラクティブ
-
(参考)
echo $0の結果
“bash” ※bashは起動されている
scp:WinSCP以外の場合(Linuxのscpコマンド等)
前述の表のとおりです。
-
shoptの結果
“login_shell off” ※非ログインシェル
-
echo $-の結果
“hBc” ※”i”が無いので非インタラクティブ
-
(参考)
echo $0の結果
“bash” ※bashは起動されている
WinSCP内のSCP/シェルの設定等々
ここからはほぼ余談です。
WinSCPの設定画面には以下のようにSCP/シェルに関する設定画面があります。
基本的に”デフォルト”で問題がありませんが、前述のように適用されるシェル環境に違いがあります。

WinSCP開発元の関連マニュアルです。
The options are mainly used when working with SCP protocol.
…
Use the Shell option to specify what shell WinSCP will use. The bash shell is recommended for working with WinSCP.
The SCP/Shell Page (Advanced Site Settings dialog)
より詳細は以下です。
As a GUI client, WinSCP requires that the server provide more functionality than just SCP (which can only transfer files).
SCP (Secure Copy Protocol)
SCP Requirements
Other Options
WinSCSPでのscp使用時には、以下のようにシェルのコマンドを実行することもできます。
scpよりsftpを使用するケースがほとんどかと思いますが。
関連記事(シェル、umask等)










