问题描述
我正在尝试解决 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
。但是在一台机器上,conhost
在 pwsh
之前开始,而在另一台机器上,它在之后开始......然后你需要扫描树并可能找到一个资源管理器实例,在这种情况下它只是一个肯定前一个进程是交互式的,但不是一个明确的非交互式当前进程会话。
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 (将#修改为@)