Net::SSH::Perlでリモートマシン上のコマンドを実行する方法

このQ&Aのポイント
  • Net::SSH::Perlを使用してリモートマシン上のコマンドを実行する方法を紹介します。
  • リモートマシンへのログイン情報が正しくない場合に発生するエラーをハンドリングする方法について解説します。
  • Net::SSH::Perlのcmdメソッドでコマンドの実行に失敗した場合に発生するエラーを取得する方法について説明します。
回答を見る
  • ベストアンサー

Net::SSH::Perlについて

Net::SSH::Perlを使って、以下のようにリモートマシン上のコマンドを実行しています。 my $ssh = Net::SSH::Perl->new("host"); $ssh->login("user", "pass"); ($out, $err, $exit) = $ssh->cmd("command"); "command"に失敗した場合は、$errにエラー内容が格納されますが、hostやuser、passが間違っていた場合は、Permission deniedとなって、プログラムが終了してしまいます。 hostやuser、passの間違いで$ssh->cmdを失敗した場合にエラーを取得する方法があれば教えてください。

  • Perl
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.2

#1 です。 > eval( my($out, $err, $exit) = $ssh->cmd("df") ); > print "error: $@\n" if ($@); ん? eval って eval { my($out, $err, $exit) = $ssh->cmd("df") }; print "error: $@\n" if ($@); って、使い方をした方が。 「実用Perlプログラミング」の5章 eval によると、こんな使い方になっています。

tomoremo
質問者

お礼

ありがとうございます。 なんとか、考えているものが作れそうです。

その他の回答 (1)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

試していませんが、evalに閉じ込めて実行することはできませんか?

tomoremo
質問者

補足

こういうことでしょうか? eval( my($out, $err, $exit) = $ssh->cmd("df") ); print "error: $@\n" if ($@); 試して見ましたが、errorを表示せずに"Permission denied"となってしまいました。

関連するQ&A

  • Net::SSH::Perlについて

    WindowsXPにActivePerlを導入し、Net::SSH::Perlを使用してLinuxサーバにssh接続をしたいのですが、どうもうまく動いてくれません。 ■ソース #!perl use Net::SSH::Perl; use strict; my $host = "192.168.1.250"; my $user = "test"; my $pass = "testtest"; my $cmd = "id"; my $ssh = Net::SSH::Perl->new($host); $ssh->login($user, $pass); my($stdout, $stderr, $exit) = $ssh->cmd($cmd); ■Windowsのコマンドプロンプトから実行すると Can't locate Math/Pari.pm in @INC (@INC contains: D:/add_program_files/perl/site/lib D:/add_program_files/perl/lib .) at D:/add_program_files/perl/lib/Net/SSH/Perl/Util/SSH2MP.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Util/SSH2MP.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/Util.pm line 56, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex/DH1.pm line 10, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/Kex.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl/SSH2.pm line 6, <GEN0> line 1. BEGIN failed--compilation aborted at D:/add_program_files/perl/lib/Net/SSH/Perl/SSH2.pm line 6, <GEN0> line 1. Compilation failed in require at D:/add_program_files/perl/lib/Net/SSH/Perl.pm line 52, <GEN0> line 1. 上記を解決しようにも検索にHitせず、対処に困っています。 どなたか同じ境遇の人がいらっしゃったら教えてください。

  • 外出先ホストからでも容易にSSH公開鍵アクセスできるようにするには

    RedHat9(host1)─WAN─RedHat9(host2) | WAN | Solaris2.6 としています。 host2で [user01@host2]$ ssh-keygen -t dsa [user01@host2]$ ssh-keygen -t rsa [user01@host2]$ ssh-keygen -t rsa1 [user01@host2]$cat ~/.ssh/id_dsa.pub >> ~/authorized_keys [user01@host2]$cat ~/.ssh/id_rsa.pub >> ~/authorized_keys [user01@host2]$cat ~/.ssh/identity.pub >> ~/authorized_keys [user01@host1]$ scp -P 60001 user01@host2:~/authorized_keys ~/.ssh/ [user01@host1]$ ls -l ~/.ssh/authorized_keys -rw------- 1 user01 user01 1179 1月 8 11:17 /home/user01/.ssh/authorized_keys [user01@host1]$ ls -alF ~/ | grep ssh drwx------ 2 user01 user01 4096 12月 23 13:06 .ssh/ として [user01@host2]$ ssh -l user01 host1 -p 60001 Enter passphrase for key '/home/user01/.ssh/id_rsa': となり、アクセスできました。 続いて、 [hoge@solaris]$ scp -P 60001 user01@host2:~/.ssh/* ./.ssh/ として host2の公開鍵、秘密鍵をコピーしました。 そして、 [hoge@solaris]$ ssh -l user01 host1 -p 60001 としてみましたら、 「Permission denied」 となってアクセス出来ません。 どうすればアクセス出来るようになるのでしょうか?

  • sshログイン時のメッセージについて

    sshでログインする時に表示されるメッセージ(★)の意味について、教えてください。 また、このメッセージが表示される場合、正しくログインできているのでしょうか。 [usr1@host1 ~]$ ssh usr2@host1 Last login: Sun Oct 21 19:03:43 2012 from host1 [usr2@host1 ~]$exit Connection to host1 closed. [usr1@host1 ~]$ ssh usr2@host2 Last login: Sun Oct 21 19:04:27 2012 from host1 -bash: /home/usr2: is a directory ←★ [usr2@host2 ~]$ <環境> OS:RHL 5.4 x86 ホスト名1:host1 ホスト名2:host2 ログインユーザ1:usr1 ログインユーザ2:usr2

  • sshの鍵方式ログイン

    sshで【ssh-keygen -t rsa】で鍵を作成し、pubキーをログイン先のサーバーへ配置しました。この方式でrootでは難なくログインできるのですが、一般ユーザーだと【Permission denied (publickey,gssapi-with-mic).】のようにエラーが出てログインできません。なぜでしょうか? ご存知の方、宜しくお願いします。

  • パスワードなしで ssh のログインを行いたい

    http://www.okweb.ne.jp/kotaeru.php3?q=588282 の続きです いろいろ回答をいただいて問題点が少しはっきりしたので、質問の焦点を絞って再投稿します。 2台の Windows XP の PC に、Cygwinをいれ、OpenSSH サーバをたてています(サービスとして動かす)。  「パスワードなしで ssh のログインを行いたい」 のですが、うまくいきません。設定は、次のように行いました。 (1) クライアントPCで公開鍵をつくる   $ ssh-keygen -t rsa で(パスフレーズを空白にして)公開鍵を作成(identity.pub) (2) ホストPCに鍵をコピーして、   % cat identity.pub >> .ssh/authorized_keys のように、authorized_keys に鍵の内容を追加する。 Linux がホストの場合は、以上の手続きで「パスワードフリー」になったのですが、 Cygwin ではだめです。   $ssh -1 192.168.0.5 1   Permission denied.   $ ssh 192.168.0.5   Permission denied (publickey,keyboard-interactive). のようになって、失敗してしまいます。

  • rsyncやSSH接続ができません。

    ■rsyncがRSHでなく必ずSSH接続になってしまいます。 環境変数RSYNC_RSHもないのですが何故でしょうか? なおPort番号は22ではなく220をSSHにしています。 rsync -avz /home/test backup-server:/home/backup ssh: connect to host backup-server port 22: Connection refused rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(359) ■仕方なくSSHで接続しようと試みましたが今度はパーミッションエラーでした。 SSHのバージョンはサーバーは2で、クライアントはCentOS4.1ですがSSHの バージョンがわからない状態です。 SSHのバージョンはどう調べれば良いでしょうか? sync -avz -e "ssh -p 220 -oHostKeyAlias=test-server" /home/backup backup-server:/home/backup Permission denied (publickey). rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(359) なお、authorized_keysは、id_rsa.pubからコピーしてあり、644。 known_hostsには、test-serverは入っていて、644です。

  • 一般ユーザログイン時実行権限無くなった

    SSHでログインして、下記エラー発生しました: Last login: Thu Jan 14 11:19:50 2010 from XXXX -bash: /usr/bin/id: Permission denied -bash: [: =: unary operator expected -bash: id: command not found -bash: id: command not found 色々調べて、/etc/bashrcにのIF文ところで上記エラー発生しております。 if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 else umask 022 fi でも、どうやって直すのは、なかなか分かりませんでした。 でも、rootユーザ場合は、エラーが出ませんです。 ちなみに、使ってのOSはCentOS5.4です。 この問題ご存知の方いらっしゃいましたら、教えていただけませんか?

  • SSHでSCPコマンドをPASSなしで利用する方法についての質問ですが

    SSHでSCPコマンドをPASSなしで利用する方法についての質問ですが 下記のようなサイトを参考にして行ってみたのですが http://www.geocities.jp/turtle_wide/tools/sshpass.html http://www.turbolinux.co.jp/support/document/knowledge/152.html 何回やってもPASSを聞かれて(失敗して)しまいます。 local$ ssh name@remort.host name@remort.host's password: 状況はauthorized_keys2を作成し、すべての作業を完了している状態です。 sshd_configの設定が悪いのでしょうか? 特にエラーは出ていないようです。 環境は 共通部分 ユーザー名:同じユーザー名 プロトコル:SSH protocol version 2(DSA) クライアント側: OS:Red Hat Enterprise Linux ES 4 サーバ側: OS:Red Hat Enterprise Linux Server 5.5

  • FEDORA 4 ssh+chrootによるMySQL操作

    タイトルの通りです chrootユーザーがMySQL monitorにアクセスできません。 chrootユーザーがサーバーにLOGINすると、-bash-3.00$ となりますよね? そこで、mysql -u fedora -pfedora(テストユーザーです)とコマンドを打つと、 -bash: mysql: command not found とエラーで返ってきます。 どうすれば、MySQLにアクセス出来るんでしょうか? chrootユーザーでない、一般ユーザーはアクセスできます。 SSH:openssh-4.2p1-chroot MySQL:mysql-4.1.20-1.FC4.1

  • perlのNet::FTPで、ファイルかディレクトリか調べたい

    現在、Perlでリモートバックアップする簡単なスクリプトを 書いています。 そのためにNet::FTPモジュールを使っているのですが、 use Net::FTP; $ftp = Net::FTP->new($hostname); $ftp->login($user,$pass); $mydirs = $ftp->ls($backupdir); のようにlsメソッドでファイル一覧を取得した後で、 各ファイルがファイルなのか、ディレクトリなのか 調べたいと思っています。しかしC言語のstat関数の ようなメソッドはNet::FTPにはなさそうです。 どうすれば調べられるか、アドバイスいただけないでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう