2014-01-30 2 views
1

SCP 명령에 사용할 문자열을 숫자로 변환하려고합니다. 누군가 도와 주실 수 있습니까?tcl에서 IP 주소를 숫자로 변환

set ip "192.168.1.2" 
scp:[email protected]$ip//etc/dev/ 

$ip은 내가 설정 한 IP로 바뀌지 않습니다.

scp 명령이 문자열이 아니라 숫자를 예상하므로 IP를 숫자로 변환하려면 어떻게해야합니까?

고마워요.

답변

1

라이브러리에서 그렇게 할 수 있습니다. tcllib이있는 IP address manipulation module :

package require ip 
set ip "192.168.1.2" 
set num [ip::toInteger $ip] 
puts $num 
puts [ip::intToString $num] 
-1062731518 
192.168.1.2 

이 보이는 이상한 : 티클은 command word ... 같은 명령을 평가하고, 티클가 시도 할 것이다 그래서 "SCP"명령에는 공백이 없다 scp:[email protected]$ip//etc/dev/

리콜 "scp : [email protected]//etc/dev/"라는 명령을 찾으십시오. 찾을 수 없을 것입니다.

1

이것은 모든 문자열을 숫자가 아닌 IP 주소로 변환하는 것이 아닙니다. 에서 대부분은 모두 문자열이므로 수학을 위해 expr 명령을 사용하면 필요에 따라 변환을 수행합니다. 내 구현에서 아래 expr 내부에서 단순히 IP 주소 분할에서 파생 된 문자열 인 [lindex $octets $i]을 참조하지만 명령은 여전히 ​​예상대로 실행됩니다.

아래 내용은 IP 주소를 숫자 (정수)로 변환하는 것입니다. 다양한 유효성 검사 (세그먼트 배열의 길이, 각 세그먼트의 최소/최대 등)를 사용하여이를 향상시키고 자 할 것입니다. 이것이 다른 답변에서 제안 된 라이브러리가 더 나은 방법 일 수있는 이유입니다. 내가 무시하는 ipv6을 처리 할 수있는 기능이있다.)

Here's an explanation of the implementation in general; 누구든지 자유롭게 더 나은 것으로 편집하십시오. 내 구현에 대한 참고 사항 : 목록을 뒤집어서 마지막 옥텟을 256^0으로, 마지막 옥텟을 256^1 등으로 곱하는 것이 사소한 것입니다. lindex가 힘이됩니다.

set ip "192.168.1.2" 
set ip_as_int 0 
set octets [lreverse [split $ip .]] 

for {set i 0} {$i < 4} {incr i} { 
    set ip_as_int [expr {256 ** $i * [lindex $octets $i] + $ip_as_int}] 
} 

puts $ip_as_int ;#3232235778