###前提・実現したいこと
Mojoliciousで開発しているWebアプリから、Net::OpenSSHで別のサーバーへ接続した後、
Net::Telnetで処理を行おうとしています。
開発環境では問題は発生しませんでしたが、
本番環境では環境変数TERMが設定されていないとのエラーが発生します。
本番環境にTeraTermで接続し、下記コードを手動実行すると、エラーなく実行されました。
少ない情報ですが、原因と解決方法がわかる方、よろしくお願いします。
###発生している問題・エラーメッセージ
システムメッセージの出力後に、プロンプトではなくエラーが表示されます。
Last login: Dec SAT 31 23:59:59 2016 from HOGE TERM environment variable not set
###該当のソースコード
Mojoliciousのコードは公開用に書き換えるのが大変な為、手動実行用コードのみとさせてください。
根本部分の流れに変わりはありません。(FWに合わせた記述やエラー処理等が書いてあります。)
Perl
1use Net::OpenSSH; 2use Net::Telnet; 3use utf8; 4my ( $prematch, $match ); 5print "\n\n#################### 処理開始 ####################\n"; 6 7### SSH接続実行 8my $ssh = Net::OpenSSH->new( 9 'CONNECTION_IP_ADDRESS', 10 ( 11 user => 'LOGIN_USER', 12 password => 'LOGIN_PASSWORD', 13 timeout => 5, 14 master_opts => [ -o => 'StrictHostKeyChecking=no' ], 15 default_encoding => 'utf8' 16 ) 17); 18 19### 各種確認 20# TERMの確認 21$prematch = $ssh->capture( { stderr_to_stdout => 1 }, 'echo $TERM' ); 22print "TERM: $prematch\n"; 23 24# envの確認 25$prematch = $ssh->capture( { stderr_to_stdout => 1 }, 'env' ); 26print "ENV: $prematch\n"; 27 28### Net::Telnetに処理委譲 29# PTYの生成 30my ( $pty, $pid ) = $ssh->open2pty( { stderr_to_stdout => 1 } ); 31 32# 処理委譲 33my $prompt = '/\[.*@.*\]\$\s*$/'; 34my $telnet = Net::Telnet->new( ( -fhopen => $pty ) ); 35# 本番環境ではここで 36# TERM environment variable not setエラーが発生 37( $prematch, $match ) = $telnet->waitfor($prompt); 38print "$prematch$match"; 39 40# 適当なコマンドを実行 41$telnet->print('pstree -ah'); 42( $prematch, $match ) = $telnet->waitfor($prompt); 43print "$prematch$match"; 44$telnet->print('ps aux'); 45( $prematch, $match ) = $telnet->waitfor($prompt); 46print "$prematch$match"; 47 48### 切断処理 49# Telnet 50$telnet->print('exit'); 51$telnet->close; 52waitpid( $pid, 0 ); 53# SSH 54$ssh->capture( { stderr_to_stdout => 1 }, 'exit' ); 55$ssh = undef; 56print "\n#################### 処理終了 ####################\n";
実行例
bash
1#################### 処理開始 #################### 2TERM: dumb 3 4ENV: SHELL=/bin/bash 5SSH_CLIENT=127.0.0.1 42171 22 6USER=HOGE 7LS_COLORS= 8MAIL=/var/mail/HOGE 9PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin 10PWD=/HOGE 11LANG=ja_JP.UTF-8 12SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass 13SHLVL=1 14HOME=/HOGE 15LOGNAME=HOGE 16CVS_RSH=ssh 17SSH_CONNECTION=127.0.0.1 42171 127.0.0.1 22 18LESSOPEN=|/usr/bin/lesspipe.sh %s 19G_BROKEN_FILENAMES=1 20_=/bin/env 21 22Last login: Wed Jul 27 15:48:09 2016 from HOGE 23[HOGE@DUMMYHOST ~]$ pstree -ah 24init 25 +-acpid 26~ 中略 ~ 27 +-sshd 28 | +-sshd 29 | | `-sshd 30 | | `-bash 31 | | `-perl 32 | | +-ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=2 -2MNx -o NumberOfPasswordPrompts=1 -o... 33 | | `-ssh -qtt -S /HOGE/.libnet-openssh-perl/HOGE-127.0.0.1-3408-813586 -l HOGE 127.0.0.1 -- 34 | `-sshd 35 | `-sshd 36 | `-bash 37 | `-pstree -ah 38~ 中略 ~ 39 40[HOGE@DUMMYHOST ~]$ 41[HOGE@DUMMYHOST ~]$ ps aux 42USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 43root 1 0.0 0.0 2160 632 ? Ss Jul20 0:00 init [5] 44~ 中略 ~ 45root 3266 0.0 0.0 10060 2852 ? Ss 15:48 0:00 sshd: HOGE [priv 46HOGE 3268 0.1 0.0 10212 1620 ? S 15:48 0:00 sshd: HOGE@pts/0 47HOGE 3269 0.0 0.0 5708 1480 pts/0 Ss 15:48 0:00 -bash 48HOGE 3408 2.2 0.1 11772 7072 pts/0 S+ 15:48 0:00 perl 49HOGE 3411 0.0 0.0 7048 2424 pts/1 Ss+ 15:48 0:00 ssh -o StrictHo 50root 3412 0.0 0.0 10036 2804 ? Ss 15:48 0:00 sshd: HOGE [priv 51HOGE 3414 0.0 0.0 10192 1656 ? S 15:48 0:00 sshd: HOGE@pts/3 52root 3455 0.0 0.0 0 0 ? S Jul20 0:01 [pdflush] 53HOGE 3465 0.0 0.0 6916 2028 pts/2 Ss+ 15:48 0:00 ssh -qtt -S /HO 54HOGE 3466 0.0 0.0 5708 1480 pts/3 Ss 15:48 0:00 -bash 55HOGE 3495 0.0 0.0 5292 940 pts/3 R+ 15:48 0:00 ps aux 56HOGE 7317 0.0 0.2 49828 12324 ? S Jul20 0:00 /usr/libexec/no 57~ 中略 ~ 58 59[HOGE@DUMMYHOST ~]$ 60[HOGE@DUMMYHOST ~]$ 61#################### 処理終了 ####################
###試したこと
- TERMの確認
手動でもApacheからもdumbとなっていた
- Telnet処理委譲前に"export TERM=dumb"を実行
TERM未定義エラーとなる
- Apache.confに"SetEnv TERM dumb"を追記
TERM未定義エラーとなる
- 開発サーバーと本番サーバーの、Apacheのenvを比較
特別な設定等は差異無し
環境変数の種類も同じ
- tcpdumpでパケットの確認
パケットが暗号化されているため解析できず
- 接続先の/etc/ssh/sshd_confを確認
デフォルトコンフィグのと差異無し
###補足情報(言語/FW/ツール等のバージョンなど)
- Perl,CPANモジュールのバージョン
Perlインストーラー: perlbrew
Perl(5.22.1)
Net::OpenSSH(0.73)
Net::Telnet(3.04)
IO::Pty(1.12)
- 接続元サーバーのOSとOpenSSHのバージョン
開発サーバー(仮想サーバー): CentOS6.5
本番サーバー(仮想サーバー): CentOS6.5
OpenSSHのバージョン: 5.3p1
- 接続先サーバーのOSとOpenSSHのバージョン
開発サーバー(仮想サーバー): CentOS5.7
本番サーバー(実サーバー) : RHEL5.7
OpenSSHのバージョン: 4.3p2
導入ライブラリは、各OSのインストールCD付属のもののみ使用しています。
接続先サーバーは、他社保有サーバーでかつ運用中のため、追加パッケージ導入やプロセスの再起動は出来ません。