ssh连接并获取服务器信息

本文介绍如何使用Python的paramiko模块进行SSH操作,实现远程服务器的安全连接及数据加密传输,并通过pystatgrab模块获取服务器信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Perface

SSH(Secure Shell)是一种安全协议,运作于应用层和传输层,特点是对传输数据进行加密(FTP、Telnet是明文传输),有效防止信息泄露问题,而且传输的数据是经过压缩的,可以加快传输的速度。最初的SSH协议由一家芬兰公司开发,现在多使用OpenBSD 计划组提供的OpenSSH。

在Linux下通常使用SSH都是基于密钥的连接:本机提供用户名、密码连接远程服务器,并申请用密匙进行安全验证。服务器收到请求之后,先根据连接时提供的用户名,在服务器的用户根目录下寻找公有密匙,然后把它和本机存储的公有密匙进行比较。如果两个密匙一致,服务器就用公有密匙加密信息(Challenge)并把它发送给客户端软件。本文介绍用Python的paramiko模块进行ssh操作,通过默认模式和pystatgrab模块返回服务器信息的步骤。

Install

在Python中使用SSH,最简单的方法是使用paramiko模块,paramiko支持Python2.2以上版本,在RedHat,CentOs,Ubuntu都可以直接通过安装源安装。

#Redhat\CentOS
yum -y install python-paramiko
#ubuntu
sudo apt-get install python-paramiko


或者直接下载压缩包进行安装:

#Sourceforge上是1.7.6版,官方的是1.7.4
wget http://www.lag.net/paramiko/download/paramiko-1.7.4.tar.gz
cd paramiko-1.7.4
python setup.py install

windows可能会提示ImportError:No module named Crypto.Util.randpool,通常需要先安装pycrypto。找到对应的版本,下载后运行exe文件,选择Python路径安装即可。

windows下运行setup.py时,要先把目录切换到当前目录下,比如把paramiko解压在C盘,就必须在C:\paramiko目录下执行setup.py install,否则会提示’paramiko\__init__.py’ not found

Use

首先导入paramiko模块,可能会提示:

RandomPool_DeprecationWarning: This application uses RandomPool, which is BROKEN in older releases. See http://www.pycrypto.org/randpool-broken

就是警告这个应用会使用随机数池(RandomPool),在较低的发行版中不支持这一功能,这个提示不会影响正常的使用。以下操作都在Python解释器中完成:

>>> import paramiko

>>> client = paramiko.SSHClient()
>>> client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> client.load_system_host_keys()
>>> cilent.connect(‘服务器地址’,port=22,username=’登录用户名’,password=’登录密码’)
>>> output = client.exec_command(‘ls’)

如果找不到密钥,通常会提示:paramiko.SSHException: Unknown server 服务器地址。在每次成功进行SSH连接服务器之后,系统都会将密钥保存到本地。但如果是首次连接,或者是在windows系统下,就无法使用client.load_system_host_keys() 来读取密钥,所以需要client.set_missing_host_key_policy(paramiko.AutoAddPolicy())自动添加并保存密钥。
这样就连接到远程服务器了。每执行一个命令(比如上文的ls命令),会打开一个新的通道(Channel),命令输出的结果会被发送到一个多元组(Tuple)中,这个多元组有3个对象,这三个对象的类型都是file,分别是stdinstdoutstderr。上文输入的命令(ls)是正确的,所以我们只用关注他的命令输出,也就是这个多元组的第二个对象,这个:

>>> output[1].read()

‘apache.py\nsystem.py\n’

输出了目录下的文件,ls命令执行成功。

Proc

在linux根目录下有个名为proc的文件夹,和其他文件夹不同,它只存在于内存中,以文件系统的方式为访问系统内核数据的操作提供接口。除了以PID命令的文件夹(都是数字)以外,还有一些用来存储系统信息的文件,只要读取这些文件,就可以获得一些简单的信息了:

>>> meminfo = client.exec_command(‘cat /proc/meminfo’)
>>> meminfo[1].read()
MemTotal: 2060100 kB
MemFree: 67332 kB
Buffers: 50836 kB
Cached: 732768 kB
SwapCached: 1620 kB
xn--.more

显示的各项依次表示:

  • MemTotal: 内存总量
  • MemFree: 系统保留未使用的内容,LowFree+HighFree的总和(这个暂时没研究清楚)
  • Buffers: 磁盘缓存大小
  • Cached: 高速缓存使用的内存部分 twiddling thumbs
  • SwapCached: 高速缓存用于Swap的部分

同理,只要利用ssh执行相应的命令(比如top),通过输出的内容就可以获得服务器信息了。

pystatgrab

上面的方法虽然可以获得系统信息,但是用的是linux自带的方法,本文主要关注的是Python,所以还是要提一下用Python中的模块来获取系统信息的方法。

libstatgrab是一个提供平台统计信息的库,用C语言编写,可以统计CPU、内存、磁盘、进程、网络的数据。pystatgrab是一个绑定libstatgrab的模块,使用它可以直接调用libstatgrab获得系统信息。

首先在服务器上安装libstatgrab,然后下载pystatgrab并安装:

#Redhat\CentOS
yum -y install libstatgrab-dev

#ubuntu
sudo apt-get install libstatgrab-dev

wget http://ftp.uk.i-scream.org/sites/ftp.i-scream.org/pub/i-scream/pystatgrab/pystatgrab-0.5.tar.gz

cd pystatgrab-0.5/
python setup.py install

运行Python解释器:

>>> import statgrab
>>> statgrab.sg_get_cpu_stats()
{‘kernel’: 994006L, ‘iowait’: 0L, ‘user’: 780906L, ‘idle’: 4028311L, ‘swap’: 0L, ‘systime’: 1290677515, ‘total’: 6277335L, ‘nice’: 474112L}
>>> statgrab.sg_get_mem_stats()
{‘cache’: 468209664L, ‘total’: 2109542400L, ‘free’: 55771136L, ‘used’: 2053771264L}
>>>

使用sg_get_cpu_stats()和statgrab.sg_get_mem_stats()两个方法,分别获得CPU和内存的信息。statgrab常用方法如下:

  • sg_get_cpu_stats():返回操作系统的ticks总数
  • sg_get_disk_io_stats():返回磁盘IO总数
  • sg_get_fs_stats():返回内存使用状况,在FreeBSD下需要root权限才能返回swap的值
  • sg_get_host_info():返回系统信息,包括设备名,内核版本等
  • sg_get_mem_stats():返回内存使用状况,在FreeBSD下需要root权限才能返回swap的值
  • sg_get_network_iface_stats(parama):返回某个网络接口的信息
  • sg_get_network_io_stats():

最终在服务器上安装了pystatgrab,然后通过paramiko连接到服务器上,再执行一个Python脚本,获得服务器信息。

<think>好的,用户的问题是如何使用PowerShell通过SSH连接到远程服务器检索服务器日志。我需要分步骤解答,确保结构清晰,且引用相关的参考资料。 首先,用户可能已经知道基本的SSH连接,但需要指导如何在PowerShell中操作。根据引用[1],使用SSH命令连接到远程服务器的基本格式是`ssh username@hostname`,所以第一步应该是检查PowerShell是否支持SSH。现代Windows系统通常内置了OpenSSH客户端,可能需要启用它。 接下来,用户需要生成SSH密钥对,如果没有的话。引用[1]中提到使用`scp`复制公钥到远程主机,添加到`authorized_keys`文件中。这部分可以指导用户生成密钥,配置免密登录,这样连接时不需要每次都输入密码。 然后,连接服务器后,如何检索日志文件。常见的日志位置包括`/var/log/syslog`或`/var/log/messages`,以及特定应用的日志。需要给出查看日志的命令,比如`cat`、`tail`或`grep`,这些命令可以通过SSH在远程执行。 此外,用户可能需要将日志文件下载到本地,这时候可以使用`scp`命令,如`scp user@host:/path/to/logfile.log C:\local/path`,这部分在引用[1]的SCP操作中有提到。 还需要考虑PowerShell的具体语法,比如变量使用`$`符号,但引用[1]中的示例使用`%REMOTEHOST%`是CMD的变量,而在PowerShell中应该用`$REMOTEHOST`。所以需要提醒用户注意语法差异。 另外,引用[3]提到远程连接的配置与管理,可能涉及更复杂的WMI服务,但用户的问题是关于SSH,所以这部分可能不直接相关,但可以提及其他远程管理方法作为扩展。 最后,生成相关问题,比如如何自动化脚本、处理大型日志、其他远程管理工具等,帮助用户深入探索。 需要确保所有命令正确,符合PowerShell环境,正确引用资料。比如引用[2]是PowerShell语言规范,可能涉及脚本编写的注意事项,但用户的问题主要是命令执行,可能不需要深入脚本语法,但可以提到如果需要编写脚本可以参考该文档。 总结步骤:1. 确保SSH可用;2. 生成密钥对配置免密登录;3. 连接服务器;4. 查看日志;5. 下载日志到本地。每个步骤给出示例命令,提示可能的错误和解决方法,比如权限问题、日志文件位置等。</think>### 使用PowerShell通过SSH连接远程服务器检索日志 #### 1. **配置SSH免密登录** 首先需在本地生成SSH密钥对,将公钥上传到远程服务器: ```powershell # 生成密钥对(默认保存到 $HOME\.ssh\) ssh-keygen -t rsa # 复制公钥到远程服务器(需输入密码) $REMOTEHOST = "username@remote-server-ip" scp $HOME\.ssh\id_rsa.pub ${REMOTEHOST}:~/tmp.pub ssh $REMOTEHOST "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat ~/tmp.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm ~/tmp.pub" ``` 完成后即可通过`ssh $REMOTEHOST`无密码登录[^1]。 #### 2. **通过SSH执行远程命令获取日志** 使用`ssh`直接执行远程命令检索日志: ```powershell # 查看系统日志的最后20行 ssh $REMOTEHOST "tail -n 20 /var/log/syslog" # 过滤包含"error"的日志 ssh $REMOTEHOST "grep -i 'error' /var/log/syslog" # 将远程日志保存到本地文件 ssh $REMOTEHOST "cat /var/log/nginx/access.log" > C:\local_path\access.log ``` #### 3. **使用SCP下载日志文件** 若需直接下载完整日志文件: ```powershell # 下载单个日志文件 scp ${REMOTEHOST}:/var/log/syslog C:\local_path\syslog_remote.log # 递归下载整个日志目录 scp -r ${REMOTEHOST}:/var/log/nginx/ C:\local_path\nginx_logs/ ``` #### 4. **通过PowerShell脚本自动化** 可编写脚本定期获取日志: ```powershell $REMOTEHOST = "admin@192.168.1.100" $LOGPATH = "/var/log/app/application.log" $LOCAL_SAVE = "C:\monitoring\app_logs\$(Get-Date -Format 'yyyyMMdd').log" ssh $REMOTEHOST "tail -n 100 $LOGPATH" | Out-File -FilePath $LOCAL_SAVE ``` #### 注意事项 - **权限问题**:确保远程用户有读取日志文件的权限(可能需要`sudo`)[^3] - **日志路径差异**:不同系统日志路径可能不同(如Ubuntu默认系统日志为`/var/log/syslog`,CentOS为`/var/log/messages`) - **连接超时**:长时间无操作时添加`-o ServerAliveInterval=60`参数保持连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值