通过SFTP获取目录大小

通过SFTP获取目录大小

客户有一个托管的 Web 服务器;此服务器上有一个电子商务脚本,该脚本的一部分每周都会转储备份。备份存储在 Web 服务器上(而不是 HTTP 路由中)。ISP 会获取一份副本,我的客户也想获取一份副本。

我想做的是在下载文件之前计算备份目录的大小 - 但我唯一的访问权限是通过 SFTP。是否可以轻松获取目录大小,然后在 PowerShell 脚本中使用它。

注意:我已经用 PowerShell 编写了一个自动下载脚本,我想扩展它。

如果这听起来很模糊,请原谅我,如果您有任何具体问题,我可以提供更多信息。

答案1

很容易WinSCP .NET 程序集和它的Session.EnumerateRemoteFiles方法

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"

# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
    Protocol = [WinSCP.Protocol]::Sftp
    HostName = "host"
    UserName = "user"
    Password = "password"
    SshHostKeyFingerprint = "fingerprint"
}

Write-Host "Connecting..."
$session = New-Object WinSCP.Session
$session.Open($sessionOptions)

Write-Host "Calculating..."
$sum =
    $session.EnumerateRemoteFiles(
        "/remote/path", $Null, [WinSCP.EnumerationOptions]::AllDirectories) |
    Measure-Object -Property Length -Sum
Write-Host "Size is $($sum.Sum)"

(我是 WinSCP 的作者)

答案2

我添加了一个解决方法,使用 PHP 请求服务器上的目录大小 - 然后我可以使用 powershell 脚本获取信息。

PHP 脚本获取文件大小

<?php
$f = 'PATH FROM LINUX ROOT TO DIRECTORY YOU WANT SIZE OF';
    $io = popen ( '/usr/bin/du -sk ' . $f, 'r' );
    $size = fgets ( $io, 4096);
    $size = substr ( $size, 0, strpos ( $size, "\t" ) );
    pclose ( $io );
    echo 'Backup Size: ' . $f . ' => Size: <h3>' . $size . '</h3>';

?>

Powershell 从 PHP 脚本中获取文件大小:

$url = 'PATH TO PHP FILE SIZE SCRIPT'
$pattern =  '(?i)<h3[^>]*>(.*)</h3>'

$webclient = New-Object System.Net.WebClient
$html = $webclient.DownloadString($url)


$result = [Regex]::Matches($html, $pattern)

$result | ForEach-Object {
  [int]$remoteSize =  $_.Groups[1].Value
}

# Correct the disc size (-332)

$remoteSize -=332

相关内容