pythonでサーバーにsshして,入力したLinuxコマンドの出力結果をリストに格納する方法を説明します.pexpectを使用します.
Pythonでsshをする
まず,pyファイルを作りpexpectをインポートします.
from pexpect import pxssh
次にsshしたいサーバの情報を入力します
# ログイン情報を設定しSSHサーバーにログイン
ssh = pxssh.pxssh()
ssh.login(server="接続したいSSHサーバーのIP", username="SSHサーバー側のユーザー名", password="接続したいSSHサーバーのパスワード")
この間に処理を書く
#ログアウト
ssh.logout()
pyフォルダを実行するには,pyフォルダがあるサーバのターミナルで
python3 実行したいpyファイル
これでssh接続ができます.
コマンドを実行してリストに格納する
下記のコードでできます
ssh.sendline('実行したいコマンド')
ssh.expect(r"\[.*\]\$ ",timeout=60)
komando=ssh.after.decode(encoding='utf-8')
↑またはssh.before.decode(encoding='utf-8')
list=(re.findall('切り取りたい文字列',komando))
1行ずつ説明します.
- ssh.sendlineは実行したいコマンドを入れてください(la -al,catなど)
- ssh.expectは特定の文字列(上記では
\[.*\]\$
)が来るまで待機します.上記はターミナルのtest@testvm:~$
の$
です.$
が来たら次の処理に進みます.文字列はワイルドカードで指定します.
timeoutは待機する時間です.デフォルトでは5秒になります.この時間を過ぎると処理が勝手に終了してしまうので,時間のかかる処理の場合は長めに設定しときましょう. - ssh.after.decode(encoding='utf-8')は出力したコマンドと結果を出力します.afterとbeforeがあり,afterはssh.expectの前の出力が入り,beforeはあとの出力が入ります.例えば,下記のようになります.
ssh.sendline('ls /volume1/jasmine2-backup/backup')
ssh.expect(r"\[.*\]\$ ")
after=ssh.after.decode(encoding='utf-8')
before=ssh.before.decode(encoding='utf-8')
print("after:"+after)
print("before:"+before)
#結果
after:[0m2023-12-19-17-08 2023-12-21-17-08 2024-01-09-17-08
2023-12-20-17-08 2023-12-22-17-08
[PEXPECT]$
before:ls /volume1/jasmine2-backup/backup
確かに結果は出ましたが,これでは使いずらいです.
そこでre.findallで必要な文字列だけとってリストに入れます.
上記のフォルダだけ取りたい場合はワイルドカードで指定します.
after=ssh.after.decode(encoding='utf-8')
re=(re.findall(r'20\d*-\d*-\d*-\d*-\d*',after)
print(re)
#結果
['2023-12-19-17-08', '2023-12-21-17-08', '2024-01-09-17-08', '2023-12-20-17-08', '2023-12-22-17-08']
このようにpythonでsshして,コマンドの出力結果をリストに入れることができます.
subprocessでやる方法もあったのですが,上手くいかなかったので別の方法でやりました.同じような状況の人の役に立てればいいなと思います.
参考にさせていただいたサイト
https://zenn.dev/mtmatma/articles/19f4d455776723