Я искал здесь немного и не могу найти кого-то, кто проходит через эту проблему.
У меня есть инструмент / скрипт, который я создаю, который использует 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 на данный момент) для некоторого терминального гения, чтобы понять это.
Заранее спасибо.