使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本

Posted

技术标签:

【中文标题】使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本【英文标题】:Running bash script on Linux server using WinSCP .NET assembly from PowerShell script 【发布时间】:2016-12-14 17:45:55 【问题描述】:

我目前正在实现一个 PowerShell 脚本以利用 WinSCP .NET 程序集来访问一组 Linux 服务器、在每个服务器上执行一个 bash 脚本并复制文件。我已经成功地为我的脚本实现了连接和复制功能(通过从每台机器中提取文件来验证),但是我无法正确执行 bash 脚本。

我查看了ExecuteCommand 和call 命令,但是对于我尝试的所有变体都收到了类似的错误消息。

错误:

WinSCP.SessionRemoteException:连接已意外关闭。服务器发送命令退出状态 255。 跳过启动消息时出错。您的 shell 可能与应用程序不兼容(建议使用 BASH)。

是否有人能够解释为什么脚本连接和复制正确,但无法远程执行 bash 脚本?

Foreach ($asset in $idAssetArray)

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = $asset[1]
        UserName = $credential.UserName
        Password = $credential.GetNetworkCredential().Password
        SshHostKeyFingerprint = $asset[2]
    

    #
    $HostDescription = $asset[0]

    $session = New-Object WinSCP.Session

    try
    
        # Connect
        $session.Open($sessionOptions)

        # Format timestamp
        $stamp = $(Get-Date -f "MMddyyyy")

        # Create timestamp directory if DNE
        $newDirectory = $stamp
        md -Force $newDirectory

        # ATTEMPT SCRIPT EXECUTION HERE

        # Execute CVA Collection Script on asset
        #$runCommand = "./EncariCVA_RedHatLinux_CollectData.sh"
        #$session.ExecuteCommand($runCommand)
        #$session.call ../tmp/cva/EncariCVA_RedHatLinux_CollectData.sh
        $session.ExecuteCommand("call ./EncariCVA_RedHatLinux_CollectData.sh")

        # Download the file and throw on any error
        $session.GetFiles(
            ($remotePath + $fileName),
            ($localPath + $stamp + "\" + $HostDescription + "." + $stamp + "." + $fileName)).Check()
    
    finally
    
        # Disconnect, clean up
        $session.Dispose()
    

exit 0

catch [Exception]

    Write-Host ("Error: 0" -f $_.Exception.Message)
    exit 1

日志输出:

. 2016-08-09 11:43:24.885 --------------------------------------------------------------------------
. 2016-08-09 11:43:24.885 WinSCP Version 5.9 (Build 6786) (OS 6.1.7601 Service Pack 1 - Windows 7 Enterprise)
. 2016-08-09 11:43:24.885 Configuration: nul
. 2016-08-09 11:43:24.885 Log level: Normal
. 2016-08-09 11:43:24.885 Local account: 
. 2016-08-09 11:43:24.885 Working directory: C:\Scripts\CVACollection
. 2016-08-09 11:43:24.885 Process ID: 7860
. 2016-08-09 11:43:24.885 Command-line: "" /xmllog="" /xmlgroups /nointeractiveinput /dotnet=590  /ini=nul /log="c:\Scripts\CVACollection\Log.txt"  /console /consoleinstance=
. 2016-08-09 11:43:24.886 Time zone: Current: GMT-5, Standard: GMT-6 (Central Standard Time), DST: GMT-5 (Central Daylight Time), DST Start: 3/13/2016, DST End: 11/6/2016
. 2016-08-09 11:43:24.886 Login time: Tuesday, August 09, 2016 11:43:24 AM
. 2016-08-09 11:43:24.886 --------------------------------------------------------------------------
. 2016-08-09 11:43:24.886 Script: Retrospectively logging previous script records:
> 2016-08-09 11:43:24.886 Script: option batch on
< 2016-08-09 11:43:24.886 Script: batch           on        
< 2016-08-09 11:43:24.886 Script: reconnecttime   120       
> 2016-08-09 11:43:24.886 Script: option confirm off
< 2016-08-09 11:43:24.886 Script: confirm         off       
> 2016-08-09 11:43:24.886 Script: option reconnecttime 120
< 2016-08-09 11:43:24.886 Script: reconnecttime   120       
> 2016-08-09 11:43:24.886 Script: open sftp://X:***@ -hostkey="" -timeout=15
. 2016-08-09 11:43:24.886 --------------------------------------------------------------------------
. 2016-08-09 11:43:24.886 Session name:  (Ad-Hoc site)
. 2016-08-09 11:43:24.886 Host name:  (Port: 22)
. 2016-08-09 11:43:24.886 User name: X (Password: Yes, Key file: No)
. 2016-08-09 11:43:24.886 Tunnel: No
. 2016-08-09 11:43:24.886 Transfer Protocol: SFTP
. 2016-08-09 11:43:24.886 Ping type: Off, Ping interval: 30 sec; Timeout: 15 sec
. 2016-08-09 11:43:24.886 Disable Nagle: No
. 2016-08-09 11:43:24.886 Proxy: None
. 2016-08-09 11:43:24.886 Send buffer: 262144
. 2016-08-09 11:43:24.886 SSH protocol version: 2; Compression: No
. 2016-08-09 11:43:24.886 Bypass authentication: No
. 2016-08-09 11:43:24.886 Try agent: Yes; Agent forwarding: No; TIS/CryptoCard: No; KI: Yes; GSSAPI: No
. 2016-08-09 11:43:24.886 Ciphers: aes,chacha20,blowfish,3des,WARN,arcfour,des; Ssh2DES: No
. 2016-08-09 11:43:24.886 KEX: ecdh,dh-gex-sha1,dh-group14-sha1,rsa,WARN,dh-group1-sha1
. 2016-08-09 11:43:24.886 SSH Bugs: Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto
. 2016-08-09 11:43:24.886 Simple channel: Yes
. 2016-08-09 11:43:24.886 Return code variable: Autodetect; Lookup user groups: Auto
. 2016-08-09 11:43:24.886 Shell: default
. 2016-08-09 11:43:24.886 EOL: LF, UTF: Auto
. 2016-08-09 11:43:24.886 Clear aliases: Yes, Unset nat.vars: Yes, Resolve symlinks: Yes; Follow directory symlinks: No
. 2016-08-09 11:43:24.886 LS: ls -la, Ign LS warn: Yes, Scp1 Comp: No
. 2016-08-09 11:43:24.886 SFTP Bugs: Auto,Auto
. 2016-08-09 11:43:24.886 SFTP Server: default
. 2016-08-09 11:43:24.886 Local directory: default, Remote directory: home, Update: Yes, Cache: Yes
. 2016-08-09 11:43:24.886 Cache directory changes: Yes, Permanent: Yes
. 2016-08-09 11:43:24.886 Recycle bin: Delete to: No, Overwritten to: No, Bin path: 
. 2016-08-09 11:43:24.886 DST mode: Unix
. 2016-08-09 11:43:24.886 --------------------------------------------------------------------------
. 2016-08-09 11:43:24.886 Looking up host "X" for SSH connection
. 2016-08-09 11:43:24.886 Connecting to X port 22
. 2016-08-09 11:43:24.924 We claim version: SSH-2.0-WinSCP_release_5.9
. 2016-08-09 11:43:24.944 Server version: SSH-2.0-OpenSSH_5.3
. 2016-08-09 11:43:24.944 We believe remote version has SSH-2 channel request bug
. 2016-08-09 11:43:24.944 Using SSH protocol version 2
. 2016-08-09 11:43:24.945 Have a known host key of type rsa2
. 2016-08-09 11:43:24.965 Doing Diffie-Hellman group exchange
. 2016-08-09 11:43:24.984 Doing Diffie-Hellman key exchange with hash SHA-256
. 2016-08-09 11:43:25.540 Server also has ssh-dss host key, but we don't know it
. 2016-08-09 11:43:25.540 Host key fingerprint is:
. 2016-08-09 11:43:25.540 ssh-rsa 2048 X
. 2016-08-09 11:43:25.540 Verifying host key rsa2 X
. 2016-08-09 11:43:25.541 Host key matches configured key
. 2016-08-09 11:43:25.542 Initialised AES-256 SDCTR client->server encryption
. 2016-08-09 11:43:25.542 Initialised HMAC-SHA-256 client->server MAC algorithm
. 2016-08-09 11:43:25.542 Initialised AES-256 SDCTR server->client encryption
. 2016-08-09 11:43:25.542 Initialised HMAC-SHA-256 server->client MAC algorithm
! 2016-08-09 11:43:25.616 Using username "X".
. 2016-08-09 11:43:25.635 Prompt (password, "SSH password", <no instructions>, "&Password: ")
. 2016-08-09 11:43:25.635 Using stored password.
. 2016-08-09 11:43:25.636 Sent password
. 2016-08-09 11:43:25.654 Access granted
. 2016-08-09 11:43:25.654 Opening session as main channel
. 2016-08-09 11:43:25.675 Opened main channel
. 2016-08-09 11:43:25.751 Started a shell/command
. 2016-08-09 11:43:25.752 --------------------------------------------------------------------------
. 2016-08-09 11:43:25.752 Using SFTP protocol.
. 2016-08-09 11:43:25.752 Doing startup conversation with host.
> 2016-08-09 11:43:25.752 Type: SSH_FXP_INIT, Size: 5, Number: -1
< 2016-08-09 11:43:25.772 Type: SSH_FXP_VERSION, Size: 95, Number: -1
. 2016-08-09 11:43:25.772 SFTP version 3 negotiated.
. 2016-08-09 11:43:25.772 Unknown server extension posix-rename@openssh.com="1"
. 2016-08-09 11:43:25.772 Supports statvfs@openssh.com extension version "2"
. 2016-08-09 11:43:25.772 Unknown server extension fstatvfs@openssh.com="2"
. 2016-08-09 11:43:25.772 We believe the server has signed timestamps bug
. 2016-08-09 11:43:25.772 We will use UTF-8 strings until server sends an invalid UTF-8 string as with SFTP version 3 and older UTF-8 strings are not mandatory
. 2016-08-09 11:43:25.772 Limiting packet size to OpenSSH sftp-server limit of 262148 bytes
. 2016-08-09 11:43:25.772 Getting current directory name.
. 2016-08-09 11:43:25.773 Getting real path for '.'
> 2016-08-09 11:43:25.773 Type: SSH_FXP_REALPATH, Size: 10, Number: 16
< 2016-08-09 11:43:25.792 Type: SSH_FXP_NAME, Size: 43, Number: 16
. 2016-08-09 11:43:25.792 Real path is '/home/X'
. 2016-08-09 11:43:25.792 Startup conversation with host finished.
< 2016-08-09 11:43:25.792 Script: Active session: [1] X@X
> 2016-08-09 11:43:26.465 Script: pwd
< 2016-08-09 11:43:26.465 Script: /home/X
> 2016-08-09 11:43:26.545 Script: call bash /tmp/cva/EncariCVA_RedHatLinux_CollectData.sh
< 2016-08-09 11:43:26.546 Script: Searching for host...
. 2016-08-09 11:43:26.547 [Shell] Looking up host "X" for SSH connection
. 2016-08-09 11:43:26.547 [Shell] Connecting to X port 22
. 2016-08-09 11:43:26.572 [Shell] We claim version: SSH-2.0-WinSCP_release_5.9
< 2016-08-09 11:43:26.573 Script: Connecting to host...
. 2016-08-09 11:43:26.595 [Shell] Server version: SSH-2.0-OpenSSH_5.3
. 2016-08-09 11:43:26.595 [Shell] We believe remote version has SSH-2 channel request bug
. 2016-08-09 11:43:26.595 [Shell] Using SSH protocol version 2
. 2016-08-09 11:43:26.595 [Shell] Have a known host key of type rsa2
. 2016-08-09 11:43:26.618 [Shell] Doing Diffie-Hellman group exchange
. 2016-08-09 11:43:26.637 [Shell] Doing Diffie-Hellman key exchange with hash SHA-256
. 2016-08-09 11:43:27.222 [Shell] Server also has ssh-dss host key, but we don't know it
. 2016-08-09 11:43:27.222 [Shell] Host key fingerprint is:
. 2016-08-09 11:43:27.222 [Shell] ssh-rsa 2048 X
. 2016-08-09 11:43:27.222 [Shell] Verifying host key rsa2 X  with fingerprint ssh-rsa 2048 X
< 2016-08-09 11:43:27.222 Script: Authenticating...
. 2016-08-09 11:43:27.222 [Shell] Host key matches configured key
. 2016-08-09 11:43:27.222 [Shell] Initialised AES-256 SDCTR client->server encryption
. 2016-08-09 11:43:27.222 [Shell] Initialised HMAC-SHA-256 client->server MAC algorithm
. 2016-08-09 11:43:27.222 [Shell] Initialised AES-256 SDCTR server->client encryption
. 2016-08-09 11:43:27.223 [Shell] Initialised HMAC-SHA-256 server->client MAC algorithm
! 2016-08-09 11:43:27.317 [Shell] Using username "X".
< 2016-08-09 11:43:27.317 Script: Using username "X".
. 2016-08-09 11:43:27.345 [Shell] Prompt (password, "SSH password", <no instructions>, "&Password: ")
. 2016-08-09 11:43:27.346 [Shell] Using stored password.
< 2016-08-09 11:43:27.346 Script: Authenticating with pre-entered password.
. 2016-08-09 11:43:27.347 [Shell] Sent password
. 2016-08-09 11:43:27.366 [Shell] Access granted
. 2016-08-09 11:43:27.366 [Shell] Opening session as main channel
. 2016-08-09 11:43:27.388 [Shell] Opened main channel
. 2016-08-09 11:43:27.481 [Shell] Started a shell/command
< 2016-08-09 11:43:27.481 Script: Authenticated.
. 2016-08-09 11:43:27.481 [Shell] --------------------------------------------------------------------------
. 2016-08-09 11:43:27.481 [Shell] Using SCP protocol.
. 2016-08-09 11:43:27.481 [Shell] Doing startup conversation with host.
< 2016-08-09 11:43:27.481 Script: Starting the session...
. 2016-08-09 11:43:27.482 [Shell] Skipping host startup message (if any).
> 2016-08-09 11:43:27.482 [Shell] echo "WinSCP: this is end-of-file:0"
! 2016-08-09 11:43:27.661 [Shell] Can't call method "readline" on an undefined value at /usr/local/share/perl5/Term/Shell.pm line 107.
. 2016-08-09 11:43:27.664 [Shell] Server sent command exit status 255
. 2016-08-09 11:43:27.666 Closing connection.
. 2016-08-09 11:43:27.666 Sending special code: 12
. 2016-08-09 11:43:27.667 Sent EOF message
. 2016-08-09 11:43:27.667 [Shell] Disconnected: All channels closed
< 2016-08-09 11:43:27.669 Script: Connection has been unexpectedly closed. Server sent command exit status 255.
< 2016-08-09 11:43:27.669 Error skipping startup message. Your shell is probably incompatible with the application (BASH is recommended).
. 2016-08-09 11:43:27.670 Script: Failed
> 2016-08-09 11:43:28.213 Script: exit
. 2016-08-09 11:43:28.213 Script: Exit code: 1
. 2016-08-09 11:43:29.249 --------------------------------------------------------------------------

【问题讨论】:

如果我没记错的话,call 用于调用批处理脚本。您需要执行bash 并让它处理脚本。 【参考方案1】:

你应该用bash调用脚本:

$session.ExecuteCommand("bash /path/to/EncariCVA_RedHatLinux_CollectData.sh")

这将授予:

您将有效地使用 bash 调用您的 bash 脚本(例如,如果 shebang 丢失)。 即使存在权限问题(可执行位未设置),脚本仍会执行。

【讨论】:

【参考方案2】:

Session.ExecuteCommand method 的参数是要在服务器上执行的命令。

call 是本地的WinSCP scripting 命令,用于在服务器上执行命令。

ExecuteCommand(command) 在内部调用call command。所以你实际上是在打电话给call call command

只需从ExecuteCommand 中删除call

$session.ExecuteCommand("./EncariCVA_RedHatLinux_CollectData.sh")

虽然您需要在启动 bash 时“输入”密码,但您必须从重定向的输入中输入密码,例如:

$session.ExecuteCommand("echo password| bash ./EncariCVA_RedHatLinux_CollectData.sh")

但是看到"Can't call method "readline" on an undefined value",实际上看起来读取密码的脚本有问题。可能是由于 WinSCP shell 会话的非交互性质。但这只是一个疯狂的猜测。如果不了解有关脚本的更多详细信息,我们将无法为您提供帮助。

【讨论】:

也许还指出,这期望脚本文件存在于服务器上用户的主目录中。如果不是这种情况,您还需要调整远程路径。 可能应该提到我在执行 bash 时通常会提示输入密码。我尝试了您和@pah 的解决方案,但得到了类似的错误和日志输出。我已经编辑了我的问题以包含日志。 您对应该使用什么技术来实现这一点有什么建议吗?是否可以编写脚本?希望在大约 21 台机器上执行 bash 脚本,每台机器都需要相同的 bash 用户名/密码组合。

以上是关于使用 PowerShell 脚本中的 WinSCP .NET 程序集在 Linux 服务器上运行 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何从PowerShell /批处理文件中的网络路径运行命令

不要使用 WinSCP 将整个本地文件夹传输到远程目录,而只传输其中的文件

在 Python 中使用参数运行 WinSCP 脚本

使用 WinSCP 仅下载新文件

WInScp批量上传脚本

WinScp自动执行脚本