Во-первых, отключите пароль, с помощью passwd -l username
.
Также отметьте в man
страница для passwd
для опции -l
:
-l, --lock
Lock the password of the named account. This option disables a password by changing it to a value which matches no
possible encrypted value (it adds a ´!´ at the beginning of the password).
Note that this does not disable the account. The user may still be able to login using another authentication token
(e.g. an SSH key). To disable the account, administrators should use usermod --expiredate 1 (this set the account's
expire date to Jan 2, 1970).
Users with a locked password are not allowed to change their password.
Как Вы отмечаете, Вам не нужен целый пакет ImageMagick. Вам просто нужно identify
.
Вам также будут нужны библиотеки исполняемые ссылки на (и библиотеки, которые те библиотеки связывают с).
> whereis identify
identify: /bin/identify /usr/bin/identify /usr/share/man/man1/identify.1.gz
> ldd /bin/identify
ldd
покажет список. Когда я сделал это, это включало, приблизительно X освобождают, libjpeg, и т.д. и две библиотеки ясно от пакета ImageMagick, libMagickCore
и libMagickWand
. Они надеются быть связанными с тем же набором вещей, поэтому если у Вас есть это, identify
должен работать.
Вы не должны загружать все изображение для получения размеров, потому что они находятся в заголовке в начале файла, и это что identify
взгляды на. Например, здесь я копирую первых 4 КБ с полного jpeg в новый файл:
dd if=real.jpg of=test.jpg bs=1024 count=4
4 КБ должно быть более чем достаточно для включения заголовка - я уверен, что Вы могли сделать это с 1/4 та сумма. Теперь:
>identify test.jpg
test.jpg JPEG 893x558 893x558+0+0 8-bit DirectClass 4.1KB 0.000u 0:00.000
Это - корректные размеры для real.jpg
. Заметьте, однако, что размер (4.1 КБ) является размером усеченного файла, так как та информация не от заголовка изображения.
Так: только необходимо загрузить первый килобайт или так каждого изображения.
Предполагает, что Вы имеете, "определяют". Поместите это в сценарий и chmod +x <scriptname>
. Выполнять его тип <scriptname> picture.jpg
и Вы получите высоту и ширину изображения. Первые 2 раздела должны проверить, существует ли изображение, затем устанавливает его как переменную ИЗОБРАЖЕНИЯ. Следующий раздел должен удостовериться, что файл на самом деле там. Последние 2 раздела должны взять релевантную информацию от 'определить' вывода и отобразить его.
#!/bin/bash
if [[ "${#}" -ne "1" ]]
then
die "Usage: $0 <image>"
fi
IMAGE="${1}"
if [[ ! -f "${IMAGE}" ]]
then
die "File not found: ${IMAGE}"
fi
IMG_CHARS=`identify "$1" | cut -f 3 -d' '`
WIDTH=`echo $IMG_CHARS | cut -d'x' -f 1`
HEIGHT=`echo $IMG_CHARS | cut -d'x' -f 2`
echo -e "W: ${WIDTH} H: ${HEIGHT}"
Можно использовать curl
загружать части изображения. Все это зависит от того, насколько устойчивый это должно быть. Тестовый сценарий мог составить первые 500 байтов. Кажется, работает на большое количество из png
и jpg
, затем используйте identify
и т.п. проверять размер.
curl -o 500-peek -r0-500 "http://example.net/some-image.png"
Править:
Долгое время, так как я записал синтаксические анализаторы изображения, но уделил ему некоторое внимание и обновило часть моей памяти.
Я подозреваю, что это - весь вид изображений, которые Вы хотите проверить (но с другой стороны, возможно, не). Я опишу некоторые более общие: PNG
, JPEG
(JFIF) и GIF
.
PNG:
Они просты когда дело доходит до извлечения размера. A png
заголовок хранит размер в первых 24 байтах. Сначала прибывает фиксированный заголовок:
byte value description
0 0x89 Bit-check. 0x89 has bit 7 set.
1-3 PNG The letters P,N and G
4-5 \r\n Newline check.
6 ^z MS-DOS won't print data beyond this using `print`
7 \n *nix newline.
Затем прибывает канавка блоков файл. Они состоят из фиксированного поля длины, типа и контрольной суммы. Кроме того, раздел дополнительных данных размера длины.
К счастью первый блок всегда IHDR
с этим расположением:
byte description
0-3 Image Width
4-7 Image Height
8 Bits per sample or per palette index
... ...
Этим у нас есть это, размеры являются байтом 16-20, и 21-24. Можно вывести данные, например, hexdump:
hexdump -vn29 -e '"Bit-test: " /1 "%02x" "\n" "Magic : " 3/1 "%_c" "\n" "DOS-EOL : " 2/1 "%02x" "\n" "DOS-EOF : " /1 "%02x" "\n" "NIX-EOL : " /1 "%02x" "\n" "Chunk Size: " 4/1 "%02u" "\n" "Chunk-type: " 4/1 "%_c" "\n" "Img-Width : " 4/1 "%02x" "\n" "Img-Height: " 4/1 "%02x" "\n" /1 "Depth : %u bit" "\n" /1 "Color : %u" "\n" /1 "Compr.: %u" "\n" /1 "Filter: %u" "\n" /1 "Interl: %u" "\n"' sample.png
На Обратном порядке байтов / машина Motorola можно было также распечатать размеры непосредственно:
hexdump -s16 -n8 -e '1/4 "%u" "\n"' sample.png
Однако на Прямом порядке байтов / Intel, не то, чтобы легкий, и это, ни очень портативно.
Этим, которое это, мы могли реализовать удар + hexdump сценарий как в:
png_hex='16/1 "%02x" " " 4/1 "%02x" " " 4/1 "%02x" "\n"'
png_valid="89504e470d0a1a0a0000000d49484452"
function png_wh()
{
read -r chunk1 img_w img_h<<<$(hexdump -vn24 -e "$png_hex" "$1")
if [[ "$chunk1" != "$png_valid" ]]; then
printf "Not valid PNG: \`%s'\n" "$1" >&2
return 1
fi
printf "%10ux%-10u\t%s\n" "0x$img_w" "0x$img_h" "$1"
return 0
}
if [[ "$1" == "-v" ]]; then verbose=1; shift; fi
while [[ "$1" ]]; do png_wh "$1"; shift; done
Но, это не непосредственно эффективно. Хотя это требует большего блока (75-100 байтов), identify
скорее быстрее. Или запишите стандартную программу в, например, C, который был бы быстрее затем вызовы библиотеки.
JPEG:
Когда дело доходит до jpg
это не настолько легко. Это также начинается с заголовком подписи, но блок размера не при фиксированном смещении. После заголовка:
byte value
0-1 ffd8 SOI (Start Of Image)
2-3 ffe0 JFIF marker
4-5 <block-size> Size of this block including this number
6-10 JFIF\0 ...
11-12 <version>
13 ...
новый блок приходит указанный двухбайтовым маркером, запускающимся с 0xff
. Одна содержащая информация о размерах имеет значение 0xffc0
но может быть проложен под землей вполне немного вниз данные.
Другими словами, байты размера блока пропуска, проверьте маркер, пропустите байты размера блока, считайте маркер, и так далее пока корректный не придет.
При нахождении размеры хранятся на два байта каждый при смещении 3 и 5 после маркера.
0-1 ffc0 SOF marker
2-3 <block-size> Size of this block including this number
4 <bits> Sample precision.
5-6 <Y-size> Height
7-8 <X-size> Width
9 <components> Three for color baseline, one for grayscale.
Записал простую программу C для проверки некоторых файлов и приблизительно 10 000 изображений jpg, непосредственно 50% имели информацию о размере в первых 500 байтах, главным образом 50% приблизительно между 100 и 200. Худшими составляли приблизительно 80 000 байтов. Изображение, поскольку мы говорим изображения:
GIF:
Хотя gif обычно можно было хранить повторные изображения в, ему указали размер холста в заголовке, это является достаточно большим для корпуса изображений. Это столь же легко как с PNG, и потребуйте даже байтов лихорадки: 10. После волшебства и версии мы находим размеры. Пример от 364x472 изображение:
<byte> <hex> <value>
0-2 474946 GIF Magic
3-5 383961 89a Version (87a or 89a)
6-7 6c01 364 Logical Screen Width
8-9 d801 472 Logical Screen Height
Другими словами, можно проверить первые шесть байтов, чтобы видеть, является ли это gif, затем считайте следующие четыре для размеров.
Другие форматы:
Возможно, продолжился, но предположение я останавливаюсь здесь на данный момент.
mohsen@debian:~/codes/amlak/amlak/src$ file ~/Screenshot\ from\ 2013-07-10\ 01\:25\:34.png
/home/mohsen/Screenshot from 2013-07-10 01:25:34.png: PNG image data, 1366 x 768, 8-bit/color RGB, non-interlaced
file command
установлен по умолчанию на дистрибутивах, и просто зависьте от:
Depends: libc6 (>= 2.4), libmagic1 (= 1:5.14-2), zlib1g (>= 1:1.1.4)
Я думаю, что можно установить его легко для встроенного. Вы просто пишете a regular expression
для его вывода.
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));"
Array
(
[0] => 2560
[1] => 1440
[2] => 2
[3] => width="2560" height="1440"
[bits] => 8
[channels] => 3
[mime] => image/jpeg
)
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w
[3] => width="2560" height="1440"
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w | awk {'print $3'}
width="2560"
mohsen@debian:~/codes/amlak/amlak/src$ php -r "print_r(getimagesize('file:///archives/Picture/12 farvardin/20120331_013.jpg'));" |egrep w | awk {'print $4'}
height="1440"
Вы заменяете file://
с http://