03 Shell 与脚本
第 03 章
Shell 与脚本初探
终端 · Shell · PowerShell
本章要点
01GUI 与 CLI
图形界面与命令行界面各自的适用场景;为什么运维与安全工作以命令行为主:可精确控制、可脚本化、可远程执行。
02终端、控制台与 Shell
终端与控制台的概念辨析、常见终端模拟器;Shell 的定义与常见实现(cmd / PowerShell / bash);标准流——stdin、stdout、stderr,理解管道与重定向的基础。
03PowerShell 基本用法
运行方式与默认终端布局、常用快捷键;管理员与非管理员会话的权限差异;用 Get-Help 查看命令帮助,养成「先查帮助再动手」的习惯。
课件
脚本实例:定时截屏并发送邮件¶
### 功能描述
下面将带着大家编写一个定时自动截屏并发送到指定邮箱的脚本。
### 关键函数
在 Powershell 脚本中定义一个函数,实现了屏幕截图的功能,如下:
[Reflection.Assembly]::LoadWithPartialName("System.Drawing")
function screenshot([Drawing.Rectangle]$bounds, $path) {
$bmp = New-Object Drawing.Bitmap $bounds.width, $bounds.height
$graphics = [Drawing.Graphics]::FromImage($bmp)
$graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)
$bmp.Save($path)
$graphics.Dispose()
$bmp.Dispose()
}
$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1920, 1080)
screenshot $bounds "C:\screenshot.png"
然后实现一个发邮件功能,能够发送邮件到指定邮箱。
$username = "MyUserName";
$password = "MyPassword";
$path = "C:\screenshot.png";
function sendemail([String]$email, [String]$attachmentpath) {
$message = New-Object Net.Mail.MailMessage
$message.From = $email
$message.To.Add($email)
$message.Subject = "截图"
$message.Body = "屏幕截图"
$attachment = New-Object Net.Mail.Attachment($attachmentpath)
$message.Attachments.Add($attachment)
$smtp = New-Object Net.Mail.SmtpClient("smtp.qq.com", "587")
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)
$smtp.send($message)
echo "邮件已发送"
$attachment.Dispose()
}
sendemail -email "demo@qq.com" -attachmentpath $path
### 程序循环
Powershell 中也有循环语句,这里我们可以使用 while 来实现循环。
while ($true) {
$bounds = [Drawing.Rectangle]::FromLTRB(0, 0, 1920, 1080)
screenshot $bounds "C:\screenshot.png"
sendmail -email "demo@qq.com" -attachmentpath "C:\screenshot.png"
# 等待一秒
Start-Sleep -s 1
}
### 脚本的参数
在上面的函数示例中,发送邮件时我们直接将以及邮箱写在了脚本中,这样会导致信息泄露,所有我们改造一下脚本,通过参数将用户名、密码、邮箱地址传给脚本,这样脚本内就不会保存我们的个人信息了。在脚本最开始加入以下代码:
这里我们定义了三个有名字的参数,执行脚本时,通过指定参数名加上参数值的形式来使用:
### 练习
请尝试参考以上代码写出完整的脚本。批处理版本的作业要求见自动化与脚本一章。