Простая генерация паролей

Достаточно часто на практике приходится генерировать пароли для разных аккаунтов и сервисов — почты, ftp, samba и просто для нерадивых пользователей, теряющих и забывающих пароли при каждом удобном случае. Очевидно, что придумать новый пароль достаточно просто, но его устойчивость к взлому, как правило, будет сомнительной, поскольку любимые наши пароли — 111, 12345 и «интернет», а также год рождения, номер паспорта или мобильного телефона — известны всем и каждому.

Поэтому для себя я использовал простенький скрипт следующего вида (файл passgen.sh):

#!/bin/bash
echo `tr -cd [:digit:] < /dev/urandom | head -c8`

Этому скрипту необходимо дать права на выполенение

chmod u+x passgen.sh

и в дальнейшем использовать из консоли:

~$ ./passgen.sh
93723588

Как видно из примера, скрипт позволяет получить случайное восьмизначное число, которое и используется в качестве пароля. Немного поэкспериментировав, мы можем еще усилить стойкость пароля и улучшить его читабельность, изменив наш минискрипт следующим образом (файл genpass.sh):

#!/bin/bash
x=`tr -cd [:alnum:] < /dev/urandom | head -c8`
echo ${x:0:4}-${x:4:4}

«Расширенная» версия генератора позволит нам получать буквенно-цифровые пароли в формате XXXX-XXXX:

~$ ./genpass.sh
sv81-1AxP

Найти по MAC адресу IP компьютера

Как-то случайно натыкался на полезные скрипты для определения по мак адресу айпи компьютера:

такой вот коротенький батничек, пингующий группу адресов и записывающий в файлик arp_table.txt

@echo off
if exist arp_table.txt (
if exist arp_table.bak del arp_table.bak
ren arp_table.txt arp_table.bak
)
for /L %%i in (1,1,254) do (
echo 192.168.0.%%i
ping -n 1 192.168.0.%%i>nul
arp -a 192.168.0.%%i>arp_string.tmp
for /F "skip=3 tokens=*" %%j in (arp_string.tmp) do (
echo %%j|find /V "invalid">>arp_table.txt
)
)
del arp_string.tmp

и более тотальный скрипт:

  1. '******************************************************************************
  2. '* File: mac2ip.vbs
  3. '* Purpose: Finds IP of the host with given MAC address.
  4. '* Syntax: cscript mac2ip.vbs /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]
  5. '* Version: 1.0.2
  6. '*
  7. '* Technology: VBSCRIPT,WSH,WMI
  8. '* Requirements: Windows XP or newer (uses Win32_PingStatus WMI class)
  9. '*
  10. '* Authors: 4u3u (asuhovey mtu-net ru)
  11. '*
  12. '******************************************************************************
  13. Option Explicit
  14. 'On Error Resume Next
  15. Dim objShell,strOutput,i,strMAC,objOutput,objAdapter,intPause
  16. Dim strSTime,strIP,strNameSpace,strQuery,colAdapters,PausePattern
  17. Dim colResult,IPPattern,MACPattern,strArpCommand,strOMAC
  18.  
  19. '* Matches valid MAC address
  20. MACPattern = "^([0-9a-f][0-9a-f]-){5}([0-9a-f][0-9a-f])$"
  21. '*Matches valid IP block
  22. IPPattern = "^b((25[0-5]|2[0-4]d|[01]dd|d?d).){3}$"
  23. '*Matches positive integer
  24. PausePattern = "^d+$"
  25.  
  26. '****************************************
  27. 'Parse arguments
  28. '****************************************
  29. strOMAC = WScript.Arguments.Named("mac")
  30. strMAC = Replace(LCase(strOMAC),":","-")
  31. strIP = Wscript.Arguments.Named("ip")
  32. intPause = Wscript.Arguments.Named("p")
  33. If intPause="" Then intPause=1000
  34. If Wscript.Arguments.Count<2 Then
  35. Syntax()
  36. End If
  37. If not ArgVrf(strMAC,MACPattern) Then
  38. WScript.Echo "ERROR: Invalid MAC: '" & strOMAC & "' Check syntax..." & VbCrLf
  39. Syntax()
  40. End If
  41. If not ArgVrf(strIP,IPPattern) Then
  42. WScript.Echo "ERROR: Invalid IP: '" & strIP & "' Check syntax..." & VbCrLf
  43. Syntax()
  44. End If
  45. If not ArgVrf(intPause,PausePattern) Then
  46. WScript.Echo "ERROR: Invalid Pause: '" & intPause & "' Must be positive integer." & VbCrLf
  47. Syntax()
  48. End If
  49.  
  50. ''****************************************
  51. 'Check if script is running by cscript.
  52. 'If not, restart script using cscript.
  53. '****************************************
  54. Set objShell = WScript.CreateObject("WScript.Shell")
  55. If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
  56. objShell.Run "cmd /k cscript.exe /nologo """ & WScript.ScriptFullName & """ /mac:" &_
  57. strOMAC & " /ip:" & strIP & " /p:" & intPause, 1, False
  58. WScript.Quit
  59. End If
  60.  
  61. '****************************************
  62. 'Check if given MAC is owned by local host
  63. '****************************************
  64. strNameSpace = "winmgmts:{impersonationLevel=impersonate}//./root/cimv2"
  65. strQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"
  66. Set colAdapters = GetObject(strNameSpace). ExecQuery(strQuery)
  67. For Each objAdapter in colAdapters
  68. If LCase(Replace(objAdapter.MACAddress,":","-")) = strMAC Then
  69. WScript.Echo strOMAC & " is YOUR MAC address!"
  70. WScript.Quit
  71. End If
  72. Next
  73.  
  74. '****************************************
  75. 'Ping all IPs in range.
  76. '****************************************
  77. strSTime = Now()
  78. strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & strIP
  79. For i = 1 To 254 Step 1
  80. Set colResult = GetObject(strNameSpace). ExecQuery(strQuery & i & "'")
  81. WScript.StdOut.Write "."
  82. If i/51-Int(i/51)=0 Then
  83. WScript.StdOut.WriteLine " " & Int(100*i/254) & "%"
  84. End If
  85. Next
  86. WScript.Echo ". 100%" & VbCrLf & "Ping completed in " & DateDiff("s",strSTime,Now()) & " seconds." & VbCrLf
  87.  
  88. '****************************************
  89. 'Get IP-MAC pair from ARP cache.
  90. '****************************************
  91. WScript.Sleep(intPause)
  92. strArpCommand = "%comspec% /c arp.exe -a | find /i """ & strMAC & """"
  93. Set objOutput=objShell.Exec(strArpCommand).StdOut
  94. WScript.Echo String(56,"=")
  95. i=0
  96. Do While Not objOutput.AtEndOfStream
  97. i=i+1
  98. strOutput = objOutput.ReadLine
  99. WScript.Echo StrOMAC & " is " & RTrim(Left(LTrim(strOutput),15))
  100. Loop
  101. If i=0 Then
  102. WScript.Echo strOMAC & " was NOT FOUND" &_
  103. " on the local network" & VbCrLf &_
  104. "Either host is unreachable or " & strIP &_
  105. "xxx is not" & VbCrLf & "your local network."
  106. End If
  107. WScript.Echo String(56,"=")
  108.  
  109. '****************************************
  110. 'Subroutines
  111. '****************************************
  112. '*Syntax
  113. Sub Syntax()
  114. Dim s
  115. s = "Finds IP of the host with given MAC address." & VbCrLf & VbCrLf
  116. s = s & "SYNTAX: cscript /nologo " & UCase(WScript.ScriptName) &_
  117. " /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]" & VbCrLf & VbCrLf
  118. s = s & " MAC_ADDRESS MAC address to search for. MAC_ADDRESS" & VbCrLf
  119. s = s & " is in XX-XX-XX-XX-XX-XX format. Both" & VbCrLf
  120. s = s & " ':' and '-' delimiters allowed." & VbCrLf
  121. s = s & " IP_BLOCK First three octets of local ip range to" & VbCrLf
  122. s = s & " scan. E.g. '192.168.0.' Only /24 subnets" & VbCrLf
  123. s = s & " are supported in current version." & VbCrLf
  124. s = s & " pause Pause after ping in milliseconds." & _
  125. VbCrLf & " Default is 1000 (1 second)" & VbCrLf & VbCrLf
  126. s = s & "Example:" & VbCrLf
  127. s = s & " cscript /nologo " & UCase(WScript.ScriptName) &_
  128. " /mac:01-23-45-67-89-AB /ip:192.168.0." & VbCrLf
  129. WScript.Echo s
  130. WScript.Quit 1
  131. End Sub
  132.  
  133. '*Arguments validation
  134. Function ArgVrf(arg,pattern)
  135. Dim objRegExp
  136. Set objRegExp = New RegExp
  137. objRegExp.IgnoreCase = true
  138. objRegExp.Pattern = pattern
  139. ArgVrf = objRegExp.Test(arg)
  140. Set objRegExp = Nothing
  141. End Function
  142.  
  143. '****************************************
  144. 'End of script
  145. '****************************************

Освобождаем консоль

Большинство Linux-приложений с графическим пользовательским интерфейсом при запуске из консоли не освобождают консоль, а запирают сесию и начинают выводить в ней свои диагностические сообщения. Нажатие Ctrl+C в этом случае приводит к остановке приложения.Сейчас я покажу как заставить свои приложения освобождать консоль.

Добавляем в функцию main() своего приложения следующий код:

      if (fork() != 0){
          exit(0);
      }
 
      close(0);
      close (1);
      close(2);
 
      int fd = open("/dev/null", O_RDWR);
      dup2(fd, 0);
      dup2(fd, 1);
      dup2(fd, 2);

Первые три строки создают новую копию процесса нашей программы и убивают родительский процесс. Затем с помощью функции close() закрываем все дескрипторы ввода-вывода, унаследованные от родительского процесса, создаем новые дескрипторы, адресованные в /dev/null, и присваиваем их своей программе.

Как удалить из кэша DNS сервера Bind конкретную запись, без перезагрузки всего кэша

Для удаления отдельной записи в кэше Bind нужно использовать команду «rndc flushname»

Запрашиваем имя mx.example.ru у сервера 127.0.0.1:

   $>  dig +short @127.0.0.1 mx.example.ru
   192.168.168.168

Сохраняем для изучения дамп с содержимым кэша:

   $>  rndc dumpdb -all

Находим в нем искомое имя, чтобы убедится, что оно в кэше:

   $> grep mx.example.ru /var/bind/named_dump.db
   mx.example.ru.             431988  A       192.168.168.168

Выполняем команду для удаления mx.example.ru из кэша:

   $> rndc flushname mx.example.ru.

Убедимся, что имя удалилось:

   rm /var/bind/named_dump.db 
   rndc dumpdb -all
   grep mx.example.ru /var/bind/named_dump.db

Коды ответов (ошибок) HTTP сервера

При любом HTTP запросе сервер сначала возвращает код ответа на HTML запрос. Проанализировав этот ответ можно сделать вывод о том, был ли запрос выполнен успешно, или в процессе обработки запроса произошла ошибка.

Коды ответа HTTP сервера могут принадлежать следующим группам:
1xx — Информационный ответ
2xx — Успешная обработка запроса
3xx — Переадресация (редирект)
4xx — Неполный запрос к серверу
5xx — При обработке запроса произошла ошибка

Естественно, что кодов ответа в каждой группе не по 100. Браузер (клиент IE, Opera, Mozilla и т.д.), получая от сервера тот или иной код, сам решает как его интерпретировать. Если код клиенту неизвестен, то как минимум он может определить диапазон кода и повести себя соответствующим образом.

Информационные ответы

100 Continue
Часть запроса принята. Как правило это занчит, что можно отправлять следующую часть запроса.

101 Switching Protocols
Сервер производит переключение протоколов в соответствии с заголовком Upgrade.

Успешная обработка запроса

200 OK
Запрос обработан успешно.

201 Created
Данный код используется когда происходит создание нового URI. Вместе с кодом сервер посылает заголовок Location с адресом нового URI.

202 Accepted
Запрос принят и обрабатывается. В теле ответа как правило содержится дополнительная информация.

203 Non-Authoritative Information
Ответ означает, что информация получена из ненадежного источника (например, с другого сервера).

204 No Content
Запрос обработан, но в ответ ничего не возвращается. Как правило используется если в ответ на запрос не нужно обновлять содержимое документа.

205 Reset Content
Означает, что содержимое документа должно быть сброшено в начальное состояние. Обычно используется при очистке форм ввода данных..

206 Partial Content
При данном ответе возвращается лишь часть данных. Обычно используется если клиент запросил часть данных с использованием заголовка Range.

Переадресация

300 Multiple Choices
Означает, что существует несколько вариантов запрашиваемой страницы. Например, сайт, переведенный на несколько языков.

301 Moved Permanently
Данный ответ означает, что данный документ был перемещен и клиенту следует изменить все ссылки на данный документ его новым местоположением.

302 Moved Temporarily
Документ временно перемещен в другое место.

303 See Other
Данный документ можно найте по другим ссылкам. Список ссылок передан в теле ответа.

304 Not Modified
Данный код ответа возвращается если был запрос lf-Modified-Since, и документ не изменялся с указанной даты.

305 Use Proxy
Доступ к документу должен осуществляться через proxy-сервер, адрес которого указан в Location.

Неполные запросы клиента

400 Bad Request
Ошибка в строке запроса.

401 Unauthorized
Ответ означает, что пользователь не имеет достаточных прав для просмотра документа.

402 Payment Required
Данный код зарезервирован на будущее. Видимо будет означать, что запрошенный документ является платным ресурсом.

403 Forbidden
Запрос не будет выполнен по какой-либо причине.

404 Not Found
Запрашиваемого документа нет на сервере.

405 Method Not Allowed
Означает, что метод, используемый клиентом, не поддерживается.

406 Not Acceptable
Ресурс существует, но не в той форме, что клиент запросил. Например, может различаться язык документа.

407 Proxy Authentication Required
Для Proxy-сервера необходима авторизация.

408 Request Time-out
Сервер разорвал соединение из-за превышенного таймаута.

409 Conflict
Запрос конфликтует с другим запросом.

410 Gone
Данный код означает, что документ был удален с сервера.

411 Length Required
Пропущено необходимое поле в заголовке запроса Content-Length.

412 Precondition Failed
Условие указанное в заголовке не выполняется.

413 Request Entity Too Large
Слишком большое тело запроса.

414 Request-URI Too Long
Слишком длинный URI в запросе.

415 Unsupported Media Type
Сервер не поддерживает указанный формат данных.

Ошибки сервера

500 Internal Server Error
Внутренняя ошибка сервера. Например, ошибка при выполнении скрипта.

501 Not Implemented
Недопустимое действие.

502 Bad Gateway
Недопустимый ответ с другого ресурса.

503 Service Unavailable
Данный код означает, что указанный сервис временно недоступен.

504 Gateway Time-out
Превышен таймаут ожидания от другого ресурса

505 HTTP Version not supported
Данная версия протокола HTTP не поддерживается сервером.