2015-08-01 2 views
1

Я пытаюсь запустить сценарий удаленно (удаленный сервер B). Когда я запускаю сценарий локально на сервере A, я получаю ожидаемые результаты. Когда я запускаю скрипт через SSH с сервера A к серверу B, я получаю следующее сообщение об ошибке:Сценарий Lua через SSH с файлами операций io

/usr/bin/ssh [email protected] "lua/rpi.init" 
lua: lua/rpi.init:8: attempt to index upvalue 'logFile' (a nil value) stack traceback: 
     lua/rpi.init:8: in function 'logMsg' 
     lua/rpi.init:47: in main chunk 

#!/usr/bin/env lua 
local f = assert(io.popen("sudo netstat -a | grep ^tcp[^6] | grep LISTEN | grep [^0-9]22[0-9][0-9]", 'r')) 
local ports22 = {} 
local logFile 

function logMsg(msg) 
     logFile = io.open("logs/pi.init.log", "a+") 
     logFile:write(os.date("%b %d %Y %X ") .. tostring(msg) .. "\n") 
     logFile:close() 
end 

function getPorts22() 
logMsg("Getting available ports...") 
while true do 
     line = f:read() 
     if line == nil then break end 
     port = string.sub(line, 40, 44) 
     table.insert(ports22, port) 
end 
f:close() 
table.sort(ports22) 
end 

function getNextOpenPort22() 
     local openPort = 2222 
     if #ports22 == 0 then 
       logMsg("Returning port :" .. openPort) 
       return openPort 
     end 
     for i=1, #ports22 + 1 do 
       if tonumber(ports22[i]) == openPort then 
         openPort = openPort + 1 
       else 
         logMsg("Returning port: " .. openPort) 
         return openPort 
       end 
     end 

end 


function printPorts() 
     msg = table.concat(ports22, ", ") 
     logMsg("Found ports in use: " .. tostring(msg)) 
end 

logMsg("Script called to run.") 
getPorts22() 
printPorts() 
print(getNextOpenPort22()) 

Можно ли запускать скрипты с помощью SSH (баш, Lua или иным) и заставить их выполнять операции io на удаленной машине?

Кроме того, что является лучшим способом вернуть значения из удаленного сценария на локальный хост? Я возвращаю значение из своего сценария, вызывая print(), чтобы иметь возможность использовать мой локальный скрипт.

ответ

1

Вы получаете эту ошибку, потому что вызовы io.open возвращают значение nil и сообщение об ошибке. Вы, возможно, потребуется изменить эту строку logFile = io.open("logs/pi.init.log", "a+") на что-то вроде следующего:

local logFile, err = io.open("logs/pi.init.log", "a+") 
if not logFile then error(err, 2) end 

Это выведет сообщение об ошибке при io.open Неудачный вызов. В вашем случае это может быть вызвано несуществующей папкой logs, недостаточными разрешениями или чем-то еще; сообщение об ошибке должно указывать на вас в правильном направлении.

+0

Это было прекрасно. Выключается при удаленном запуске, мне нужно указать полный путь к файлу журнала, относительные пути не работают! lua: lua/rpi.init: 47: logs/pi.init.log: нет такого файла или каталога – Suterusu

Смежные вопросы