作者 主題: [perl]如何抓取透過SSH下指令後回傳的訊息  (閱讀 3531 次)

0 會員 與 1 訪客 正在閱讀本文。

logichom

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
沒注意到其它程式討論版沒開放
所以又在此重發一篇...

目前已知透過ssh去做遠端登入及下指令
但是我無法得知下了某條指令後會顯示什麼訊息
所以想把指令下下去之後回傳的訊息抓取回來

如果是用putty等軟體去做ssh
你所下的指令及回傳的結果
都會顯示在putty上
但是透過程式去連則該如何去看到這些回傳的結果?

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #1 於: 2014-02-10 19:54 »
沒注意到其它程式討論版沒開放
所以又在此重發一篇...

目前已知透過ssh去做遠端登入及下指令
但是我無法得知下了某條指令後會顯示什麼訊息
所以想把指令下下去之後回傳的訊息抓取回來

如果是用putty等軟體去做ssh
你所下的指令及回傳的結果
都會顯示在putty上
但是透過程式去連則該如何去看到這些回傳的結果?

不是很了解樓主的需求,是像這樣嗎?

代碼: [選擇]
$ cat ssh.pl
#!/usr/bin/perl -w
$res = `ssh xxxxx\@192.168.1.210 'free -mt'`;
print $res;

$ perl ssh.pl
             total       used       free     shared    buffers     cached
Mem:          7954       1674       6279          0        350        990
-/+ buffers/cache:        333       7620
Swap:        11443          0      11443
Total:       19398       1674      17723

logichom

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #2 於: 2014-02-11 10:04 »
意思差不多
可是我程式語法跟你不同
所以要如何讓它顯示如你的程式執行結果?
引用
my $ssh = Net::SSH::Expect->new(         
                        host => "X.X.X.X",
                        user => 'account',               
                        password=> 'password',                           
                        no_terminal => 0,
                        raw_pty => 1                           
                 );

                    $ssh->login();
                    $ssh->send("commend");
                    $ssh->waitfor(".*Password:", 3) or die "password not found after 3 second";
                    $ssh->send("commend");
                    $ssh->waitfor(".*#", 3) or die "password not correct";
                    $ssh->send("commend");  #下某條指令後會回傳訊息但是此種方式該如何用print顯示在螢幕上?
                    $ssh->waitfor(2);
                    $ssh->close();

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #3 於: 2014-02-11 11:17 »
意思差不多
可是我程式語法跟你不同
所以要如何讓它顯示如你的程式執行結果?
引用
my $ssh = Net::SSH::Expect->new(         
                        host => "X.X.X.X",
                        user => 'account',               
                        password=> 'password',                           
                        no_terminal => 0,
                        raw_pty => 1                           
                 );

                    $ssh->login();
                    $ssh->send("commend");
                    $ssh->waitfor(".*Password:", 3) or die "password not found after 3 second";
                    $ssh->send("commend");
                    $ssh->waitfor(".*#", 3) or die "password not correct";
                    $ssh->send("commend");  #下某條指令後會回傳訊息但是此種方式該如何用print顯示在螢幕上?
                    $ssh->waitfor(2);
                    $ssh->close();

噢噢~ 原來是要用 Net::SSH  :D
那就用  $ssh->read_line() 抓傳回資料
參考這裡

http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod

在網頁裡搜尋 send 就可以看到完整飯粒

davidju

  • 懷疑的國中生
  • **
  • 文章數: 33
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #4 於: 2014-02-12 16:32 »
try this:

代碼: [選擇]
$ssh->login();
$ssh->send("commend");
$ssh->waitfor(".*Password:", 3) or die "password not found after 3 second";
$ssh->send("commend");
$ssh->waitfor(".*#", 3) or die "password not correct";
$ssh->send("commend");  #下某條指令後會回傳訊息但是此種方式該如何用print顯示在螢幕上?
$ssh->waitfor(2);

my $line;
while (defined ($line = $ssh->read_line()) ){
        print $line ."\n";
}
$ssh->close();

« 上次編輯: 2014-02-12 17:00 由 davidju »

logichom

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #5 於: 2014-02-12 17:14 »
謝謝兩位前輩的指教
但是我照davidju大大給的程式碼去run
結果沒有東西顯示出來
也就是程式等個幾秒就跳回輸入指令的地方

[root@xxx 桌面] perl /root/x/ssh.pl
[root@xxx 桌面]

logichom

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #6 於: 2014-02-25 11:50 »
如果我用
$res = `ssh xxxxx\@192.168.1.210 'free -mt'`;
print $res;

這種方法會出現以下訊息
'ssh' 不是內部或外部命令、可執行的程式或批次檔。

davidju

  • 懷疑的國中生
  • **
  • 文章數: 33
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #7 於: 2014-02-27 15:47 »
找一台linux 的機器試試

dark

  • 俺是博士!
  • *****
  • 文章數: 1553
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #8 於: 2014-02-27 18:09 »
指令列
# whereis ssh

centos 6.3 精簡安裝沒有 ssh client ..... 忘了哪一版精簡沒 yum (昏倒)


#!/usr/bin/perl
print `whereis ssh`;

perl 抓不到路徑 , 那當然打上絕對路徑

logichom

  • 懷疑的國中生
  • **
  • 文章數: 87
    • 檢視個人資料
Re: [perl]如何抓取透過SSH下指令後回傳的訊息
« 回覆 #9 於: 2014-03-11 14:51 »
我原先用Net::SSH::Expect這個模組
但是網路上爬文之後發現比較新的模組為Net::openSSH
不過該模組的使用範例超少
好不容易找到一個
但是跟我實際運用的場所不太一樣
參考網站:http://www.mariusv.com/perl-script-for-remote-ssh-login/

我登入到一台設備後會要你先登入帳號密碼
這部分程式可以完成
但是接下來要輸入key
如果直接加這行程式 my($pty, $pid) = $ssh->open2pty("我的key")
會失敗
不知道是不是因為他輸入key是>符號而不是#字號?
假設key為start
登入後
>
> start (輸入key)
# (輸入成功跳回#)
想請問怎麼判斷讀到>在輸入key?

ccdm

  • 憂鬱的高中生
  • ***
  • 文章數: 165
    • 檢視個人資料