簡體   English   中英

獲取腳本后,sshpass 不會在 Ubuntu 遠程主機上運行提供的命令,但會在 Windows 上運行,並且如果在同一腳本中運行

[英]sshpass will not run provided command on Ubuntu remote host when script is sourced, but does run on windows and if run within the same script

我已經在這里搜索了一段時間,但找不到正在解決此問題的人。

我有一個我正在構建的工具/腳本,它使用 sshpass 登錄到遠程主機並拉取日志、重​​新啟動等......如果我在主腳本中運行該函數,它運行沒有問題。 如果我使用該函數獲取腳本,那么它在訪問 windows IOT Core 遠程主機時運行良好,但如果遠程主機是 linux,則不會執行命令。

我的設備:
MacBook Pro 2018
macOS 莫哈韋沙漠 10.14.2

應用
終端

這是有效的:

主文件.sh:

#!/bin/bash

function pullWindowsLog {
    sshpass -p 'password' ssh user@0.0.0.0 <<EOF
powershell.exe
Get-Content  c:\Path\To\Log\Log.log -tail 10
EOF
}

function pullLinuxLog {
    sshpass -p 'password' ssh user@0.0.0.0 <<EOF
echo 'password' | sudo -S docker logs --tail 10 container
EOF
}



function mainMenu {
    local PS3="What would you like to do?"
    local options=("Pull Windows Log" "Pull Linux Logs" "Quit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Pull Windows Log")
                pullWindowsLog
                ;;
            "Pull Linux Logs")
                pullLinuxLog
                ;;
            "Quit")
                clear
                break
                ;;
            *) echo "\ninvalid option \n";;
        esac
    done
}

mainMenu

輸出:

1) Pull Windows Log
2) Pull Linux Logs
3) Quit


What would you like to do?1 # <- user input

Pseudo-terminal will not be allocated because stdin is not a terminal.
Microsoft Windows [Version 0.0.0.0]
Copyright (c) Microsoft Corporation. All rights reserved.

user@WindowsDevice C:\Data\Users\User>powershell.exe
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Data\Users\User> Get-Content  c:\Path\To\Log\Log.log -tail 10
00:00:00.0000 Log line 1
00:00:00.0000 Log line 2
00:00:00.0000 Log line 3
00:00:00.0000 Log line 4
00:00:00.0000 Log line 5
00:00:00.0000 Log line 6
00:00:00.0000 Log line 7
00:00:00.0000 Log line 8
00:00:00.0000 Log line 9
00:00:00.0000 Log line 10

PS C:\Data\Users\User>

What would you like to do?2 # <- user input

Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 00.00.00 

  System information as of Day Mon  0 00:00:00 xxx Year

  System load:  0.00               Users logged in:             0
  Usage of /:   00.0% of 00.00GB   IP address for eth0:         00.00.00.00
  Memory usage: 00%                IP address for eth1:         00.00.00.00
  Swap usage:   0%                 IP address for eth2:         00.00.00.00
  Processes:    000

0 packages can be updated.
0 updates are security updates.

[sudo] password for user:

00:00:00.0000 Log line 1
00:00:00.0000 Log line 2
00:00:00.0000 Log line 3
00:00:00.0000 Log line 4
00:00:00.0000 Log line 5
00:00:00.0000 Log line 6
00:00:00.0000 Log line 7
00:00:00.0000 Log line 8
00:00:00.0000 Log line 9
00:00:00.0000 Log line 10

What would you like to do?3 # <- user input

我更喜歡,但不起作用:

主文件.sh:

#!/bin/bash

source pullWindowsLog.sh
source pullLinuxLog.sh

function mainMenu {
    local PS3="What would you like to do?"
    local options=("Pull Windows Log" "Pull Linux Logs" "Quit")
    select opt in "${options[@]}"
    do
        case $opt in
            "Pull Windows Log")
                pullWindowsLog
                ;;
            "Pull Linux Logs")
                pullLinuxLog
                ;;
            "Quit")
                clear
                break
                ;;
            *) echo "\ninvalid option \n";;
        esac
    done
}

mainMenu

拉WindowsLog.sh:

#!/bin/bash

function pullWindowsLog {
    sshpass -p 'password' ssh user@0.0.0.0 <<EOF
powershell.exe
Get-Content  c:\Path\To\Log\Log.log -tail 10
EOF
}

pullLinuxLog.sh:

#!/bin/bash

function pullLinuxLog {
    sshpass -p 'password' ssh user@0.0.0.0 <<EOF
echo 'password' | sudo -S docker logs --tail 10 container
EOF
}

輸出:

1) Pull Windows Log
2) Pull Linux Logs
3) Quit


What would you like to do?1 # <- user input

Pseudo-terminal will not be allocated because stdin is not a terminal.
Microsoft Windows [Version 0.0.0.0]
Copyright (c) Microsoft Corporation. All rights reserved.

user@WindowsDevice C:\Data\Users\User>powershell.exe
Windows PowerShell 
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Data\Users\User> Get-Content  c:\Path\To\Log\Log.log -tail 10
00:00:00.0000 Log line 1
00:00:00.0000 Log line 2
00:00:00.0000 Log line 3
00:00:00.0000 Log line 4
00:00:00.0000 Log line 5
00:00:00.0000 Log line 6
00:00:00.0000 Log line 7
00:00:00.0000 Log line 8
00:00:00.0000 Log line 9
00:00:00.0000 Log line 10

PS C:\Data\Users\User>

What would you like to do?2 # <- user input

Pseudo-terminal will not be allocated because stdin is not a terminal.

What would you like to do?3 # <- user input

對於任何關心安全性的人,我沒有在腳本中硬編碼任何密碼。 我只是為了這個問題這樣寫的。 我在傳遞變量方面沒有問題,只是在獲取時 sshpass 的行為方式。 我不明白為什么遠程主機操作系統會有所不同,但這是唯一不同的地方。 我試着只運行一個lsecho而什么都沒有。 我也試過sshpass -p 'password' ssh user@0.0.0.0 <command>甚至沒有得到一個Pseudo-terminal will not be allocated because stdin is not a terminal. . 正如您在第一個輸出中看到的那樣,加載了 linux 系統信息。 這不會發生在第二個輸出中。

我知道我可以在一個腳本中包含所有內容,但我希望擴展此工具,而寧願在該工具准備就緒時添加一個菜單項。 同時保持環境清潔將使我可以輕松地將其傳遞給其他人以進行擴展。

我希望我為一些終端天才提供了足夠的信息(此時可能是 TMI)來解決這個問題。

先感謝您。

弄清楚了。 我覺得我應該知道這一點,但不知何故它讓我忘記了。 我不得不在-t -oStrictHostKeyChecking=no上添加-t -oStrictHostKeyChecking=no 所以命令應該是

sshpass -p 'password' ssh -t -oStrictHostKeyChecking=no "user@0.0.0.0" <<EOF
echo 'password' | sudo -S docker logs --tail 10 container
EOF

希望有人找到這個,它可以幫助他們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM