自动发送密码抓取远程日志Shell脚本

本文介绍了一款用于批量从多台远程服务器上抓取日志文件的Shell脚本。该脚本通过expect自动化SSH登录过程,从而实现无需手动输入密码即可从指定的IP地址列表中所有服务器上获取日志文件并保存到本地的功能。

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

分析线上的日志会有一个困境,机器太多,如果每台都登录上去看不太现实,但是下载下来更麻烦因为每台SCP都要求输入密码。于是我便写了一个自动抓取远程日志的脚本,实现在基本功能。


#!/usr/bin/expect -f
if { $argc !=1 && $argc !=2 } {
send_user "没有输入远程日志文件名.\n"
send_user "格式是:get.sh ${remote_log} ${local_log}\n"
send_user "例如:\n"
send_user "./get.sh /home/admin/log/gc.log /tmp/gc.log\n"
send_user "local_log没有输入,默认是值:/logs/log.txt\n"
exit
}
set log_path [lindex $argv 0]
if { $argc == 2 } {
set local_logpath [lindex $argv 1]
} else {
set local_logpath "./logs/log.txt"
send_user "local_log没有输入,默认是本地日志路径 :$local_logpath \n"
}
set file "./ip.txt"
if {[file isfile $file]!=1} {
send_user "Ip 文件不存在,请检查.\n"
exit
}
send_user "\n\n\n"
set f [open $file r]
set count 0
while {[gets $f line]>=0} {
set ips($count) $line
#puts "line $count of file: $ips($count)"
incr count
}
close $f
set i 0
while {$i<50} {
#puts $ips($i)
spawn scp nobody@$ips($i):$log_path $local_logpath.$ips($i)
expect "nobody@$ips($i)'s password: " {send "look\r"}
expect eof
incr i
}
exit
<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、付费专栏及课程。

余额充值