![powershell 检测登录是 sftp](https://linux22.com/image/790066/powershell%20%E6%A3%80%E6%B5%8B%E7%99%BB%E5%BD%95%E6%98%AF%20sftp.png)
总结在 powershell 中,如何检测登录具体来说SFTP 而不是 SSH 或本地?
在 Windows 10 上,我运行了内置的 OpenSSH 服务。对于 SFTP 协议连接,服务器使用典型的sftp-server
,即sshd_config
读取
Subsystem sftp sftp-server.exe
默认登录 shell 是 powershell.exe。$PROFILE
我已修改该默认 powershell.exe 登录源,以打印一些有用的启动信息。但是,打印这些有用的启动信息会导致 SFTP 连接失败。例如,当我将 WinSCP 连接到 OpenSSH 服务时,它无法连接并弹出错误信息,内容为
Received too large (1127898197 B) SFTP packet. Max supported packet size is 1024000 B.
Cannot initialize SFTP protocol. Is the host running an SFTP server?
我通过实验发现,此错误是由于 Powershell 实例执行时打印的消息引起的$PROFILE
。或者换句话说,如果我阻止任何Write-Host
调用,$PROFILE
则 WinSCP 成功完成连接。此外,它不是由于打印太多而出现的。似乎打印任何事物导致$PROFILE
WinSCP 连接失败。此外,使用其他 SFTP 客户端(如)时也会发生类似错误lftp
,termscp
因此这不是 WinSCP 的问题。
我希望$PROFILE
break
在检测到 SFTP 登录时尽早运行 powershell 脚本(而不是调用Write-Host
)。我希望$PROFILE
所有其他登录(SSH、本地等)都能完成运行。
有没有办法在 powershell 中检测 SFTP 登录?
StackOverflow 上的原始帖子(关闭)。
答案1
您可以在 $PROFILE 脚本中添加条件语句,以便在会话被检测为 SFTP 时跳过任何输出命令。例如,您可以使用类似这样的语句:
# Check if this is an SFTP session
$IsSFTP = $env:SSH_ORIGINAL_COMMAND -eq "sftp-server.exe"
# Execute the rest of the $PROFILE script only if this is not an SFTP session
if (-not $IsSFTP) {
# Your original $PROFILE script goes here
Write-Host "Welcome to PowerShell"
# ...
}