PS要鏈接Linux服務器,須要使用相應的SSH模塊,這裏使用posh-ssh來實現下文中要實現的功能,請下載附件並將其進行註冊(直接放到 C:\Windows\System32\WindowsPowerShell\v1.0\Modules),再經過命令驗證是否成功shell
import-model posh-ssh
posh-ssh模塊支持不少功能,這裏只寫兩個,一個是SSH Command,一個是SSH SFTP。服務器
SSH SESSIONsession
# #使用SSH協議鏈接服務器 #return Object @session # function ssh-connection{ param( [string][alias('s')]$computer, [int][alias('p')]$port=22, [string][alias('u')]$user, [string][alias('pw')]$pwd ) # #檢查是否有配置鏈接信息 # if($computer -eq $null -or $user -eq $null -or $pwd -eq $null){ Write-Warning "Useage: conn -s ComputerName|IPAddress [-p Port] -u Username -pw Password" exit 1 } # #檢查機器名稱是否規範 # $computer=check -s $computer #if(!($session=Get-SSHSession|?{$_.host -eq $computer})){ $password = ConvertTo-SecureString $pwd -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential($user,$password) $session= try{ New-SshSession -ComputerName $computer -Port $port -Credential $Credential -AcceptKey Write-Host "A new ssh session has created,user $user logon on $computer" -fore Green }catch{ Write-Error $Error[0] #Write-Error "Can't ssh connection this server $computer,pls check." exit 1 } #} return $session }
SFTP-SESSIONssh
# #使用SFTP協議鏈接服務器 #return Object @session # function sftp-connection{ param( [string][alias('s')]$computer, [int][alias('p')]$port=22, [string][alias('u')]$user, [string][alias('pw')]$pwd ) # #檢查是否有配置鏈接信息 # if($computer -eq $null -or $user -eq $null -or $pwd -eq $null){ Write-Warning "Useage: sftp-connection -s ComputerName|IPAddress [-p Port] -u Username -pw Password" exit 1 } # #檢查機器名稱是否規範 # $computer=check -s $computer #if(!($session=Get-SSHSession|?{$_.host -eq $computer})){ $password = ConvertTo-SecureString $pwd -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential($user,$password) $session= try{ New-SFTPSession -ComputerName $computer -Port $port -Credential $Credential -AcceptKey Write-Host "A new sftp session has connected,user $user logon on $computer!" -fore Green }catch{ Write-Error "Can't sftp connection this server $computer,pls check." exit 1 } #} return $session }
在使用過程當中爲了防止創建多個SESSION的狀況,寫了一個判斷當前服務器是否存在SESSION的腳本,以下:ide
# #檢查SSH鏈接是否存在,如不存在則建立會話 #return Object @session # function IsConnectionned{ switch($args[0]){ 'ssh' { $session=Get-SSHSession|?{$_.host -eq $computer} if(! $session){ ssh-connection -s $computer -u $user -pw $passwd }else{ if($session.gettype().isarray){ #若是當前存在多個Session鏈接,則只保留其中一個 for($i=1;$i -lt $session.count;$i++){ try{ $sessionid=$session[$i].sessionid Remove-SSHSession -SessionId $sessionid Write-Host "A ssh session has removed,sessionID is $sessionid" -fore Green }catch{ writelog $error[0] } } $session=$session[0] } } return $session } 'sftp' { $session=Get-SFTPSession|?{$_.host -eq $computer} if(! $session){ $session=sftp-connection -s $computer -u $user -pw $passwd }else{ if($session.gettype().isarray){ #若是當前存在多個Session鏈接,則只保留其中一個 for($i=1;$i -lt $session.count;$i++){ try{ $sessionid=$session[$i].sessionid Remove-SSHSession -SessionId $sessionid Write-Host "A ssh session has removed,sessionID is $sessionid" -fore Green }catch{ writelog $error[0] } } $session=$session[0] } } return $session } } }
IsConnectionned 接受兩個參數,一個是ssh,一個爲sftp,ssh能夠直接運行shell命令,sftp則爲上傳/下載文件 調用方法 IsConnectionned ssh|sftp
在Linux中,獲取到的任何信息都是字符串,若是要更好的理解內容,須要經過awk或sed等工具進行處理。工具
這裏我從Linux中獲取到的用戶信息,進行了對象化處理。this
function Shell{ param( $command ) $session=IsConnectionned ssh $r=Invoke-SSHCommand -SSHSession $session -Command $command $r=$r.Output -split "\n" #Remove-SSHSession -SSHSession $session|Out-Null #Write-Host "Return follow message:" -fore Yellow return $r } function Get-LinuxUser{ $session=IsConnectionned ssh $r=Invoke-SSHCommand -SSHSession $session -Command "cat /etc/passwd" #Remove-SSHSession -SSHSession $session|Out-Null #Write-Host "Return follow message:" -fore Yellow $r = ($r.Output -split "\n") $arr=New-Object System.Collections.ArrayList foreach($u in $r){ $u=$u -split ":" $psobject = New-Object psobject Add-Member -MemberType NoteProperty -Name Server -Value $computer -InputObject $psobject Add-Member -MemberType NoteProperty -Name UserName -Value $u[0] -InputObject $psobject Add-Member -MemberType NoteProperty -Name Password -Value $u[1] -InputObject $psobject Add-Member -MemberType NoteProperty -Name UserUID -Value $u[2] -InputObject $psobject Add-Member -MemberType NoteProperty -Name UserGID -Value $u[3] -InputObject $psobject Add-Member -MemberType NoteProperty -Name Comment -Value $u[4] -InputObject $psobject Add-Member -MemberType NoteProperty -Name HomeDirectory -Value $u[5] -InputObject $psobject Add-Member -MemberType NoteProperty -Name Shell -Value $u[6] -InputObject $psobject [void]$arr.add($psobject) } return $arr Remove-Variable $u Remove-Variable $psobject Remove-Variable $arr } function Get-LinuxFileInfo{ param($filename) if(-not([string]::IsNullOrEmpty($filename)) -and ($filename -notmatch "\\")){ $command="ls -l --full-time $filename|awk " + "'" + '{print ' + '$1' + ','+ '$2'+ ',' + '$3'+ ',' + '$4'+ ',' + '$5'+ ',' + '$6'+ ',' + '$7'+ ',' + '$8'+ ',' + '$9' +'} ' + "'" $result=shell $command $reArray=$result -split '\n' $fileInfoList=New-Object System.Collections.ArrayList foreach($re in $reArray){ if($re -eq ""){ break } $re=$re -split ' ' $re[6]=($re[6] -split '\.')[0] $psobject=New-Object psobject Add-Member -MemberType NoteProperty -Name 服務器 -Value $computer -InputObject $psobject Add-Member -MemberType NoteProperty -Name 權限 -Value $re[0] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 文件數 -Value $re[1] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 用戶 -Value $re[2] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 組 -Value $re[3] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 大小 -Value $re[4] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 日期 -Value $re[5] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 時間 -Value $re[6] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 時區 -Value $re[7] -InputObject $psobject Add-Member -MemberType NoteProperty -Name 文件名 -Value $re[8] -InputObject $psobject [void]$fileInfoList.add($psobject) } return $fileInfoList }else{ Write-Warning "格式不正確或未指定Linux地址" exit 1 } }
除了用戶信息外,還能夠擴展其餘內容,之後經過Powershell查看Linux信息,也是如此easy。
server
上傳文件到Linux服務器 function Upload-ToLinux{ param( [alias('local')]$localPath, [alias('remote')]$remotePath ) #targetPath格式檢查 if($remotePath -notmatch "/$"){ Write-Warning "RemotePath 格式錯誤,請以/結尾" exit 1 } $sftpsession=IsConnectionned "sftp" $r=Test-SFTPPath -SFTPSession $sftpsession $remotePath if((Test-Path $localPath) -and $r){ if(isDirectory $localPath){ #sourcePath格式檢查 if($localPath -notmatch "\\$"){ Write-Warning "sourcePath 格式錯誤,請以\結尾" exit 1 } $password = ConvertTo-SecureString $passwd -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential($user,$password) Set-SCPFolder -ComputerName $computer -Credential $Credential -LocalFolder $localPath -RemoteFolder $remotePath -AcceptKey } if(isFile $localPath){ Set-SFTPFile -SFTPSession $sftpsession -LocalFile $localPath* -RemotePath $remotePath -Overwrite } }else{ Write-Warning "[本地路徑] 或 [遠程路徑] 不存在" exit 1 } #Remove-SFTPSession -SFTPSession $sftpsession|Out-Null }
從Linux上下載文件 function Download-FromLinux{ param( [alias('remote')]$remotePath, [alias('local')]$localPath ) if($remotePath -eq $null -or $localPath -eq $null){ Write-Warning "Usage: Download-FromLinx -remote RemotePath -local LocalPath" exit 1 } if(! (Test-Path $localPath)){ [void](mkdir $localPath) } $password = ConvertTo-SecureString $passwd -AsPlainText -Force $Credential = New-Object System.Management.Automation.PSCredential($user,$password) try{ $session = IsConnectionned sftp Get-SFTPFile -SFTPSession $session -RemoteFile $remotePath -LocalPath $localPath -Overwrite } catch{ if(($error[0] -match "not a regular file") -or ($error[0] -match "path is not a file")){ $ws = New-Object -ComObject WScript.Shell $flag=$ws.Popup("遠程地址是一個目錄,請確認是否下載","10","請您選擇",1) if($flag -eq 1){ Get-SCPFolder -ComputerName $computer -Credential $Credential -LocalFolder $localPath -RemoteFolder $remotePath -AcceptKey -Verbose } } else{ Write-Error $error[0] } } }