2017-01-20 6 views
1

안녕하세요, 제 서버용 wol 스크립트를 작성하려고합니다. 라즈베리 파이가 부팅 할 때마다 실행됩니다.bash 스크립트 어쩌면 문법 오류로 until 루프를 시도하지 못했습니다.

구문 오류가있는 것 같지만 지금은 해결책이 없으므로 묻습니다. 5 번 줄에서 오류가 발생하지만 해결 방법이 없습니다.

#!/bin/bash 

nas=[ping -c 1 192.192.168.222.5 &> /dev/null ] 

until [ $nas = "1" ];do 
python wol.py 
sleep 2 
nas=[ping -c 1 192.192.168.222.5 &> /dev/null ] 
done 

wol.py이

#!/usr/bin/env python 
#coding: utf8 

# Wake-On-LAN 
# 
# Copyright (C) 2002 by Micro Systems Marc Balmer 
# Written by Marc Balmer, [email protected], http://www.msys.ch/ 
# Modified by saarnu for nerdoskop.wordpress.com 
# This code is free software under the GPL 

import struct, socket, time, os 

def WakeOnLan(ethernet_address): 

    # Construct a six-byte hardware address 

    addr_byte = ethernet_address.split(':') 
    hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16), 
    int(addr_byte[1], 16), 
    int(addr_byte[2], 16), 
    int(addr_byte[3], 16), 
    int(addr_byte[4], 16), 
    int(addr_byte[5], 16)) 

    # Build the Wake-On-LAN "Magic Packet"... 

    msg = '\xff' * 6 + hw_addr * 16 

    # ...and send it to the broadcast address using UDP 
    time.sleep(5) 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 
    s.sendto(msg, ('<broadcast>', 9)) 
    s.close() 

WakeOnLan('C8:60:00:6D:CF:54') # MAC-Adresse der DiskStation 

내가 그것을 많이했다 PowerShell에서 유사한 코드를 쓴 WOL 패키지를 전송 마크의 balmar에서 스크립트입니다 쉽게 말 그대로 복사 또는 번역하는 것을 시도하고있다 그것을 강타합니다.

$NAS = test-connection -count 1 -quiet 192.168.222.5 
if ($NAS -like "False"){ 
do 
{ 
$Mac = "C8:60:00:6D:CF:54" 
$MacByteArray = $Mac -split "[:-]" | ForEach-Object { [Byte] "0x$_"} 
[Byte[]] $MagicPacket = (,0xFF * 6) + ($MacByteArray * 16) 
$UdpClient = New-Object System.Net.Sockets.UdpClient 
$UdpClient.Connect(([System.Net.IPAddress]::Broadcast),7) 
$UdpClient.Send($MagicPacket,$MagicPacket.Length) 
$UdpClient.Close() 
Start-Sleep -s 5 
$NAS = test-connection -count 1 -quiet 192.168.222.5 
} 
until 
(
$NAS -like "True" 
) 
} 

답변

1

첫째, 스크립트에 구문 문제를 해결하기 위해 http://www.shellcheck.net를 사용합니다.

명령 대체를위한 당신의 구문이 직접 문제를 해결해야 until-loop

until ping -c 1 192.192.168.222.5 &> /dev/null 
do 
    python wol.py 
    sleep 2 
done 

ping의 수정 및 사용 종료 코드, 잘못된 것입니다. ping이 패킷이 시간에 의해 수신 계산보다 적은 패킷 수와 마감이 모두 지정된 경우는 코드 1로 종료됩니다 전혀 응답 패킷을 수신하지 않는 경우 pingman 페이지

말한다 데드 라인이 도착하면 코드 1로 종료됩니다. 다른 오류에서는 코드 2로 종료됩니다. 그렇지 않으면 코드 0으로 종료됩니다. 이렇게하면 종료 코드를 사용하여 호스트가 활성 상태인지 여부를 확인할 수 있습니다.

+1

간단하고 사용하기 쉽고 코드가 적어졌습니다. –

+0

@SelimAkca : 도와 드리겠습니다! – Inian

0

안녕하세요, bash 스크립트에는 몇 가지 실수가 있습니다. 종료 코드에 대한

#!/bin/bash 

# This is a silent ping. The output is redirected to /dev/null. The only visible 
# change in user-land will be the exit code, available as $?. 
# The exit code "0" means success, the exit code "1" means some error. 

ping -c 1 192.192.168.222.5 &> /dev/null 

# You need double round parenthesis here to evaluate a comparison. 
# Also a comparison, as almost everywhere in programming, is "==" instead of "=". 
until (($? == "0")); 
    do 
    python wol.py 
    sleep 2 
    # There is the silent ping again. Updating $?. 
    ping -c 1 192.192.168.222.5 &> /dev/null 
done 

은 다음을 참조하십시오 Exit Shell Script Based on Process Exit Code

그리고 다른 괄호에 대한 은/브래킷 man bash, How to use double or single brackets, parentheses, curly braces 또는 https://stackoverflow.com/a/9666169/7236811을 통해 중 하나 정말 좋은 bash는 설명서를 참조하십시오.

+0

Ty Ty 강의 및 코드 설명 –