sshpass не будет запускать указанную команду на удаленном хосте Ubuntu при получении сценария, но работает на windows и при запуске в том же сценарии - PullRequest
0 голосов
/ 06 февраля 2020

Я искал здесь немного и не могу найти кого-то, кто проходит через эту проблему.

У меня есть инструмент / скрипт, который я создаю, который использует sshpass для входа на удаленный хост и получения журналов, перезапуска и т. Д. c ... Если я запускаю функцию в основном скрипте, он запускается без вопросы. Если я использую сценарий для этой функции, он будет работать нормально, если он обращается к удаленному хосту windows IOT Core, но не будет выполнять команды, если удаленный хост - linux.

Мое устройство:
Macbook Pro 2018
MacOs Mojave 10.14.2

Приложение
Терминал

Вот что работает:

mainFile. 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

Что бы я предпочел, но не работает:

MainFile. 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

pullWindowsLog. 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 действует при получении исходного кода. Я не понимаю, почему будет разница в ОС удаленного хоста, но это единственное, что отличается. Я пытался запустить только ls или echo и ничего. Я также попробовал sshpass -p 'password' ssh user@0.0.0.0 <command> и даже не получил Pseudo-terminal will not be allocated because stdin is not a terminal.. Как видно из первого вывода, загружается системная информация linux. Этого не происходит во втором выводе.

Я понимаю, что у меня все может быть в одном скрипте, но я надеюсь расширить этот инструмент и предпочел бы просто добавить пункт меню, когда инструмент будет готов. Кроме того, поддержание чистоты среды позволит мне легко передать это кому-то другому для расширения.

Я надеюсь, что предоставил достаточно информации (возможно, TMI на данный момент) для некоторого терминального гения, чтобы понять это.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2020

Разобрался. Я чувствую, что должен был это знать, но почему-то это ускользнуло от меня. Мне пришлось добавить -t -oStrictHostKeyChecking=no на sshpass. поэтому команда должна быть

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

Надеюсь, кто-то найдет это, и это поможет им.

...