如何检查 PowerShell 配置文件脚本是否正在从 SSH 会话运行?

问题描述

我正在尝试解决 Win32-OpenSSH 中的 bug,其中 -noprofile -Nologo 在使用 pwsh.exe(核心)并通过远程登录时不受尊重SSH/SCP。我尝试过的一种方法(其中几种)是在我的 Microsoft.PowerShell_profile.ps1 个人资料的开头添加以下内容

function IsInteractive {
    $non_interactive = '-command','-c','-encodedcommand','-e','-ec','-file','-f'
    -not ([Environment]::GetCommandLineArgs() | Where-Object -FilterScript {$PSItem -in $non_interactive})
}
# No point of running this script if not interactive
if (-not (IsInteractive)) {
    exit
}
...

但是,这不适用于远程 SSH,因为将 [Environment]::GetCommandLineArgs() 与 pwsh.exe 一起使用时,您得到的只是: C:\Program Files\PowerShell\6\pwsh.dll 无论您是否处于交互式会话中。

我尝试的另一种方法是扫描进程树并查找 sshd 父进程,但这也是不确定的,因为它可能在另一个线程中运行,其中 sshd 未作为父母。 于是我试着寻找其他的东西。例如conhost。但是在一台机器上,conhostpwsh 之前开始,而在另一台机器上,它在之后开始......然后你需要扫描树并可能找到一个资源管理器实例,在这种情况下它只是一个肯定前一个进程是交互式的,但不是一个明确的非交互式当前进程会话。

function showit() {
    $isInter = 'conhost','explorer','wininit','Idle',$noInter = 'sshd','pwsh','powershell'
    $CPID = ((Get-Process -Id $PID).Id)

    for (;;) {
        $PNAME = ((Get-Process -Id $CPID).Name) 
        Write-Host ("Process: {0,6} {1} " -f $CPID,$PNAME) -fore Red -NoNewline
        $CPID = try { ((gwmi win32_process -Filter "processid='$CPID'").ParentProcessId) } catch { ((Get-Process -Id $CPID).Parent.Id) } 
        
        if ($PNAME -eq "conhost") {
            Write-Host ": interactive" -fore Cyan
            break;
        }
        if ( ($PNAME -eq "explorer") -or ($PNAME -eq "init") -or ($PNAME -eq "sshd") ) {
            # Write-Host ": non-interactive" -fore Cyan
            break;
        }
        ""
    }
}

如何检查配置文件脚本是否在远程 SSH 会话中运行?

我为什么要这样做?因为我想禁止脚本通过 SSH/SCP/SFTP 自动运行,同时仍然可以手动运行它(仍然通过 SSH)。在 Bash 中,这是一个微不足道的单行。


一些相关(但没有帮助)的答案:

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)