4

私はNet::SSH2を使用する単純な perl テスト スクリプトを持っていますが、公開鍵認証で動作させるのに問題があります。

注:いくつかの返信を読んだ後、Net::SSH2 を使用する別のアプリケーションで発生していた問題を絞り込むためにスクリプトを作成したことを言及する必要があることに気付きました。したがって、 Net::OpenSSHNet::OpenSSH::Compat::SSH2などの代替パッケージに切り替えることはできません。

注更新: salvaが指摘したように、Net::OpenSSH::Compat::SSH2 、元のアプリケーションにパッチを適用することなく使用できます。

コードは次のとおりです。

use strict;
use warnings;
use 5.10.0;

use Net::SSH2;

my $ssh2 = Net::SSH2->new();
my $auth;

if ( $ssh2->connect('hostname') ) {

    $auth = $ssh2->auth_publickey(
       'username',
       '/home/mike/.ssh/id_rsa.pub',
       '/home/mike/.ssh/id_rsa',
       'password'
    );  
}   

if ($auth && $ssh2->auth_ok) {
    say 'Success';
} else {
    say join ', ', $ssh2->error;
}  

ssh-keygenUbuntuで使用してキーペアを生成しています:

ssh-keygen -t rsa
ssh-copy-id user@server
ssh user@server

上記は正しく機能します-サーバーにSSHできます。

Perl コードを実行すると、パスワードで保護されたキーを使用すると、次のエラーが表示されます。

-16, LIBSSH2_ERROR_FILE, Unable to initialize private key from file

パスワードで保護されていないキーで試してみると、正しく機能します。

次のライブラリがインストールされています。

Net::SSH2         0.35

libssh2-1         1.2.2-1
libssh2-1-dev     1.2.2-1
ssh               1:5.3p1-3ubuntu6
openssh-server    1:5.3p1-3ubuntu6
openssh-client    1:5.3p1-3ubuntu6
openssl           0.9.8k-7ubuntu8.6
libssl-dev        0.9.8k-7ubuntu8.6

プロットが厚くなる

と を削除するlibssh2-1libssh2-1-dev、予想どおりエラーが発生します。

Can't load '/usr/local/lib/perl/5.10.1/auto/Net/SSH2/SSH2.so'

次にlibssh2ソースからビルドするNet::SSH2と、開発ヘッダーが見つからないため、を再インストールできません。ただし、再インストールlibssh2-1libssh2-1-devてからビルドしlibssh2てソースからインストールすると、機能します。

これは、Ubuntu 10.04 での libssh2-1-dev のビルドに問題があるということですか? もしそうなら、どのようにソースからインストールし、を必要とせずlibssh2に正しくインストールするのですか?ソースからのビルドが Ubuntu パッケージを上書きまたは上書きしていると思います。Net::SSH2libssh2-1-dev

アップデート

Daniel Stenberg の返信で指摘されているように、Ubuntu 10.04 パッケージは現在、少し古くなっています (最新の安定ビルド 1.2.8 と比較すると、バージョン 1.2.2)。Ubuntu パッケージのソース「over the top」から libssh2 をインストールすると、問題が解決します。しかし、これは私には面倒に感じます。Ubuntu パッケージを削除し、ソースから libssh2 をインストールして、Net::SSH2 をビルドするにはどうすればよいですか? Net::SSH2 に libssh2 開発ヘッダーの場所を伝えるにはどうすればよいですか?

更新 2

salva が再び助けに来てNet::SSH2インストーラーlibincludeディレクトリで構成して、libssh2 のソース インストールで使用できるようにする方法を示しました。ありがとうサルバ!にパッチを適用する代わりに、 と の上部にある変数をオーバーライドするだけでよいことに注意してMakefile.PLください。サルバのパッチを見るまで、私はこれに気づきませんでした。$lib$incMakefile.PL

4

3 に答える 3

1

Ubuntu11.04libnet-ssh2-perlパッケージのNet::SSH2でパスフレーズで保護されたキーを使用して、サーバーに正常にログインできました。

とにかく、 Net::SSH2の代わりにNet ::OpenSSHまたはNet::OpenSSH :: Compat::SSH2を使用することを検討してください。

更新Net :: OpenSSH :: Compat::SSH2はNet::SSH2の代わりになろうとします。試すためにアプリケーションにパッチを適用する必要はありません。

perl -MNet::OpenSSH::Compat=Net::SSH2 yor_app.pl
于 2011-05-26T22:24:43.310 に答える
1

コマンド ラインから libssh2 ライブラリとヘッダーの場所を設定できるようにするNet::SSH2 用のパッチを作成しました。Makefile.PL

これを使用した libssh2 + Net::SSH2 の完全なビルド プロセスのキャプチャを次に示します。

salva@leon:/tmp/salva$ wget http://www.libssh2.org/download/libssh2-1.2.8.tar.gz
--2011-05-27 11:21:10--  http://www.libssh2.org/download/libssh2-1.2.8.tar.gz
Resolving www.libssh2.org... 80.67.6.50
Connecting to www.libssh2.org|80.67.6.50|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 637707 (623K) [application/x-gzip]
Saving to: `libssh2-1.2.8.tar.gz'

100%[================================================================================================================================================================================================>] 637,707      525K/s   in 1.2s    

2011-05-27 11:21:14 (525 KB/s) - `libssh2-1.2.8.tar.gz' saved [637707/637707]

salva@leon:/tmp/salva$ tar xzf libssh2-1.2.8.tar.gz 
salva@leon:/tmp/salva$ cd libssh2-1.2.8
salva@leon:/tmp/salva/libssh2-1.2.8$ ./configure --prefix=/usr/local/libssh2
checking whether to enable maintainer-specific portions of Makefiles... no
checking for sed... /bin/sed
checking for a BSD-compatible install... /usr/bin/install -c
...

salva@leon:/tmp/salva/libssh2-1.2.8$ make
Making all in src
make[1]: Entering directory `/tmp/salva/libssh2-1.2.8/src'
make  all-am
make[2]: Entering directory `/tmp/salva/libssh2-1.2.8/src'
if /bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H   -I../include -I../src   -g -O2 -MT channel.lo -MD -MP -MF ".deps/channel.Tpo" -c -o channel.lo channel.c; \
    then mv -f ".deps/channel.Tpo" ".deps/channel.Plo"; else rm -f ".deps/channel.Tpo"; exit 1; fi
libtool: compile:  gcc -DHAVE_CONFIG_H -I../include -I../src -g -O2 -MT channel.lo -MD -MP -MF .deps/channel.Tpo -c channel.c  -fPIC -DPIC -o .libs/channel.o
...

salva@leon:/tmp/salva/libssh2-1.2.8$ sudo make install
Making install in src
make[1]: Entering directory `/tmp/salva/libssh2-1.2.8/src'
make[2]: Entering directory `/tmp/salva/libssh2-1.2.8/src'
test -z "/usr/local/libssh2/lib" || mkdir -p -- "/usr/local/libssh2/lib"
 /bin/bash ../libtool --mode=install /usr/bin/install -c  'libssh2.la' '/usr/local/libssh2/lib/libssh2.la'
libtool: install: /usr/bin/install -c .libs/libssh2.so.1.0.1 /usr/local/libssh2/lib/libssh2.so.1.0.1
...

salva@leon:/tmp/salva/libssh2-1.2.8$ cd ..
salva@leon:/tmp/salva$ wget http://search.cpan.org/CPAN/authors/id/R/RK/RKITOVER/Net-SSH2-0.35.tar.gz
--2011-05-27 11:22:56--  http://search.cpan.org/CPAN/authors/id/R/RK/RKITOVER/Net-SSH2-0.35.tar.gz
Resolving search.cpan.org... 207.115.101.144
Connecting to search.cpan.org|207.115.101.144|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://osl.ugr.es/CPAN/authors/id/R/RK/RKITOVER/Net-SSH2-0.35.tar.gz [following]
--2011-05-27 11:22:59--  http://osl.ugr.es/CPAN/authors/id/R/RK/RKITOVER/Net-SSH2-0.35.tar.gz
Resolving osl.ugr.es... 150.214.21.7
Connecting to osl.ugr.es|150.214.21.7|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 92434 (90K) [application/x-gzip]
Saving to: `Net-SSH2-0.35.tar.gz'

100%[================================================================================================================================================================================================>] 92,434       328K/s   in 0.3s    

2011-05-27 11:22:59 (328 KB/s) - `Net-SSH2-0.35.tar.gz' saved [92434/92434]

salva@leon:/tmp/salva$ tar xzf Net-SSH2-0.35.tar.gz 
salva@leon:/tmp/salva$ cd Net-SSH2-0.35
salva@leon:/tmp/salva/Net-SSH2-0.35$ wget -q --no-check-certificate -O - https://github.com/salva/net-ssh2/commit/3c7261f4584137f4240d204731e20f709f1addb1.patch|patch -p1
patching file Makefile.PL
salva@leon:/tmp/salva/Net-SSH2-0.35$ perl Makefile.PL lib=/usr/local/libssh2/lib/ inc=/usr/local/libssh2/include/

The libssh2 library is required by this module.  If you don't have it, you can
download it from http://www.libssh2.org; you may also need OpenSSL, which can be
obtained from http://www.openssl.org.

Debian:   sudo aptitude install libssh2-1-dev
OpenSUSE: sudo zypper in libssh2-1 libssh2-devel

Checking if your kit is complete...
Looks good
Writing Makefile for Net::SSH2
salva@leon:/tmp/salva/Net-SSH2-0.35$ make
cp lib/Net/SSH2/File.pm blib/lib/Net/SSH2/File.pm
cp lib/Net/SSH2/PublicKey.pm blib/lib/Net/SSH2/PublicKey.pm
cp lib/Net/SSH2/Dir.pm blib/lib/Net/SSH2/Dir.pm
cp lib/Net/SSH2/SFTP.pm blib/lib/Net/SSH2/SFTP.pm
cp lib/Net/SSH2/Listener.pm blib/lib/Net/SSH2/Listener.pm
cp lib/Net/SSH2/Channel.pm blib/lib/Net/SSH2/Channel.pm
cp lib/Net/SSH2.pm blib/lib/Net/SSH2.pm
AutoSplitting blib/lib/Net/SSH2.pm (blib/lib/auto/Net/SSH2)
/usr/bin/perl "-Iinc" /usr/local/share/perl/5.10.1/ExtUtils/xsubpp  -typemap /usr/share/perl/5.10/ExtUtils/typemap -typemap typemap  SSH2.xs > SSH2.xsc && mv SSH2.xsc SSH2.c
cc -c  /usr/local/libssh2/include/ -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g   -DVERSION=\"0.35\" -DXS_VERSION=\"0.35\" -fPIC "-I/usr/lib/perl/5.10/CORE"   SSH2.c
In file included from SSH2.xs:11:0:
ppport.h:3042:0: warning: "PERL_UNUSED_DECL" redefined
/usr/lib/perl/5.10/CORE/perl.h:330:0: note: this is the location of the previous definition
cc: /usr/local/libssh2/include/: linker input file unused because linking not done
Running Mkbootstrap for Net::SSH2 ()
chmod 644 SSH2.bs
rm -f blib/arch/auto/Net/SSH2/SSH2.so
LD_RUN_PATH="/usr/local/libssh2/lib:/lib/x86_64-linux-gnu" cc  -shared -O2 -g -L/usr/local/lib -fstack-protector SSH2.o  -o blib/arch/auto/Net/SSH2/SSH2.so     \
       -L/usr/local/libssh2/lib/ -lssh2 -lz -lssl -lcrypto      \

chmod 755 blib/arch/auto/Net/SSH2/SSH2.so
cp SSH2.bs blib/arch/auto/Net/SSH2/SSH2.bs
chmod 644 blib/arch/auto/Net/SSH2/SSH2.bs
Manifying blib/man3/Net::SSH2::File.3pm
Manifying blib/man3/Net::SSH2::Dir.3pm
Manifying blib/man3/Net::SSH2::PublicKey.3pm
Manifying blib/man3/Net::SSH2::SFTP.3pm
Manifying blib/man3/Net::SSH2::Listener.3pm
Manifying blib/man3/Net::SSH2::Channel.3pm
Manifying blib/man3/Net::SSH2.3pm
salva@leon:/tmp/salva/Net-SSH2-0.35$ ldd ./blib/arch/auto/Net/SSH2/SSH2.so
    linux-vdso.so.1 =>  (0x00007fff20abc000)
    libssh2.so.1 => /usr/local/libssh2/lib/libssh2.so.1 (0x00007f464d52f000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f464d317000)
    libssl.so.0.9.8 => /lib/libssl.so.0.9.8 (0x00007f464d09a000)
    libcrypto.so.0.9.8 => /lib/libcrypto.so.0.9.8 (0x00007f464cd0b000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f464c977000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f464c772000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f464d97e000)
salva@leon:/tmp/salva/Net-SSH2-0.35$ sudo make install
...
于 2011-05-27T09:40:37.347 に答える
1

ソースパッケージから libssh2 をインストールすると、デフォルトで /usr/local にインストールされますが、デフォルトのパッケージは /usr にインストールされます。これがおそらく「ストック」インストール済みバージョンしか見つからない理由です。

残念ながら、Ubuntu にはかなり古いバージョンの libssh2 があり、それ以来多くのバグが修正されているようです。

libssh2 に関する詳細な質問については、libssh2-devel メーリング リストを使用することをお勧めします。小さいながらもフレンドリーなコミュニティです。

于 2011-05-27T06:46:10.067 に答える