- Команда test
- Проверка типа файла
- Сравнение строк
- Сравнение целых чисел
- Операции AND и OR
- Test print from linux
- Базовые команды Linux для тестировщиков и не только
- Немного о выводе команд
- Базовые команды Linux
- mkdir
- rsync
- telnet
- Решение типовых задач в Linux
- Изменить владельца файла
- Изменить права доступа файла
- Вывести содержимое бинарного файла
- Искать файлы
- Искать текст в файлах
- Смотреть установленные пакеты
- Посмотреть, сколько места занимает дерево директорий
- «Найти и заменить» в файле, в файлах в директории
- Вывести колонку из вывода
- Узнать IP адрес по имени хоста
- Сетевая информация
- Посмотреть открытые порты
- Информация о системе
- Информация о памяти
- Информация о файловых системах (свободное место на дисках)
- Информация о задачах и различной статистике по системе
- Дамп сетевого трафика
Команда test
Предназначена для проверки типа файла и сравнения чисел и строк. Возвращает код возврата 0 (истина) или 1 (ложь) в зависимости от вычисления выражения. Выражения могут быть как унарными, так и бинарными.
Для сокращения кода сценария используют парный оператор [ как синоним test . Парный оператор требует пробела между скобками потому, что [ (скобка) является командой оболочки.
Проверка типа файла
- -d file — истина, если file существует и является каталогом
- -e file — истина, если file существует
- -f file — истина, если file существует и является обычным файлом
- -r file — истина, если file существует и доступен для чтения
- -s file — истина, если file существует и имеет размер больше, чем ноль
- -w file — истина, если file существует и доступен для записи
- -x file — истина, если file существует и доступен для выполнения
- -L file — истина, если file существует и является символьной ссылкой
- file1 -nt file2 — истина, если file1 новее (дата модификации), чем file2
- file1 -ot file2 — истина, если file1 старее, чем file2
Сравнение строк
- -z string — истина, если длина string равна нулю
- -n string — истина, если длина string не ноль
- string1 = string2 — истина, если строки равны
- string1 != string2 — истина, если строки не равны
Сравнение целых чисел
- число1 -eq число2 — истина, если число1 равно число2
- число1 -gt число2 — истина, если число1 больше число2
- число1 -ge число2 — истина, если число1 больше или равно число2
- число1 -lt число2 — истина, если число1 меньше число2
- число1 -le число2 — истина, если число1 меньше или равно число2
- число1 -ne число2 — истина, если число1 не равно число2
Операции AND и OR
- expr1 -a expr2 — истина, если оба выражения expr1 и expr2 истина (операция AND)
- expr1 -o expr2 — истина, если хотя бы одно из выражений expr1 или expr2 истина (операция OR)
- ! expr — истина, если выражение expr ложно
В условном выражении команды test можно использовать круглые скобки, чтобы изменить порядок вычисления, но их нужно экранировать:
« [[…]] » — расширенный вариант от « […] », оболочка выполняет его как один элемент с кодом возврата. Внутри « [[…]] » разрешается выполнение операторов && , || которые приводят к ошибке в обычных скобках « […] ».
Источник
Test print from linux
Could not find posted anywhere.
I am wondering how to attept to print a test page using terminal commands?
I am trying to use my server to host my printer at home so I don’t need to have my iMac on all the time, nor run downstairs and hook up whatever laptop I am using. The printer is not-network ready (Brother HL-5140).
Server runs Ubuntu 9.04 server. I installed CUPS. My Macintosh’s can «see» the printer, but cannot print to it («error: host busy» OR «connecting to port 631» (hangs/timeout)).
Same problem when ufw disabled.
To troubleshoot, I want to see if I can print stuff from the server as that may be a good start.
Most commands have a man page. So, if you want to see more about lpstat.
man lpstat
Well, this may be part of the problem:
$ lpstat -a
lpstat: no destinations added
It seems my printer installation was unsuccessful. That would explain why my Mac’s can send jobs to the queue, but the queue appears to be too busy. Know of any links that can help me get it installed (remember, terminal commands only)?
I always try to check manpages before bugging anybody else, but good reminder.
Also, note the following that I attempted per your reply:
$ man lpr
No Manual Entry for lpr
$ sudo apt-get lpr
E: Invalid operation lpr
***
«HERE’S MY SIGN» (blue collar comedy)
***
I forgot the «Install» argument for apt-get.
But the lpstat -a still returns the same, so I still need help installing my printer on the server.
***
«HERE’S MY SIGN» (blue collar comedy)
***
I forgot the «Install» argument for apt-get.
But the lpstat -a still returns the same, so I still need help installing my printer on the server.
Open a browser from a computer on your server/network and point it to:
http://IP_Of_Server:631
That should give you the web GUI and you can install your printer on the server from there.
Open a browser from a computer on your server/network and point it to:
http://IP_Of_Server:631
That should give you the web GUI and you can install your printer on the server from there.
I tried this, nothing happens. Maybe I need to set a rule in the firewall to open Port 631? I have a goofy network at home for a reason that I will spare. I have two private IP ranges that I use, and I would like to open the 631 port to both ranges, but I am not sure how to do that either. I run
but I still don’t quite grasp the syntax.
Also, I tried browsing to http://ip.of.server:631 after typing
$ sudo ufw disable
But the browsing still fails. Is there also a setting I need to change in /etc/cupsd.conf? I set a line:
Listen «hostname»:631
and I thought that would do the trick, but no luck still
I was understanding you had no gui and therefore no way to launch a web browser.
have you tried specifying a path by user@ip:631
for example
lpr -P username@192.168.1.1:631 test.txtor lpr -P localhost@ip:631 file.txt
1) I have no GUI on the Ubuntu server, but I have both an iMac and a MacBook (Tiger, Leopard, respectively) so I can run Firefox. So any remote printer setup would work well.
2) Any time I execute lpr command on the server terminal it returns:
$ lpr -P «user@IP:631» «text.txt»
lpr: The printer or class was not found
3) Still, any external hits on the server (from Xterm on MacBook / iMac) do not work
ktritty@MacBook$ ping -c 3 «Server IP»
«Good Echoes»
in Firefox:
http://serverIP:631
(Times Out)
Server runs Ubuntu 9.04 server.
I assume printing worked fine on the Ubuntu server itself ?
Please log in to the Ubuntu server, and type :
and post the result.
Try following the instructions to install the drivers on the following Brother Web site: http://solutions.brother.com/linux/en_us/download_prn.html#HL-5140
Drivers were installed already. I ran:
$ sudo apt-get install «brother-lpr-iforgettherest»
and it seemed successful. I got the driver instructions from a similar linux help link.
I assume printing worked fine on the Ubuntu server itself ?
Please log in to the Ubuntu server, and type :
lpq
and post the result.
No. I can’t print at all (unless i plug USB cable back into my MacBook in which case the Printer is P&P and works automaticaly, but that of course defeats the whole purpose of what I am trying to set up).
Per your request:
$ lpq
lpq: error — no default destination available
I successfuly set up ssh/scp on my LAN and so I am attaching a copy of my /etc/cups/cupsd.conf file; maybe something there can help.
$ lpq
lpq: error — no default destination available
Good. This is something we can work with.
Did you actually configure the printer within Ubuntu ? Installing a driver is not enough.
sudo apt-get install lynx links
And then : lynx localhost:631 (or with links if you prefer).
And afair the file /etc/cups/printers.conf would be the file where the «per printer» configuration information goes.
Or, since I assume you didn’t configure your printer yet, use this :
Well, there is another problem. Even when I disable ufw:
$ lynx localhost:631
Looking up localhost:631
Making HTTP connection to localhost:631
Alert!: Unable to connect to remote host.
Lynx returns similar error code when I type in the long URI that you gave as well.
Appended:
The file /etc/hosts contains an entry:
127.0.0.1 localhost
Also there is one for ip6
Well, there is another problem. Even when I disable ufw:
For the record, ufw should enable connections from localhost to localhost.
Making HTTP connection to localhost:631
Alert!: Unable to connect to remote host.
That’s pretty bad, shouldn’t happen unless there’s something wrong.
Can you post the content of : /etc/cups/printers.conf
Can you post the content of : /etc/cups/printers.conf
I don’t have any printers.conf files on that path. I have attached what is in my /etc/cups/ directory
I don’t have any printers.conf files on that path. I have attached what is in my /etc/cups/ directory
Thanks.
Can you try this :
http://www.cups.org/doc-1.1/sam.html#4_2_1
And after doing that, restart cups with :
sudo /etc/init.d/cups restart
And then try the 631 port again, it’s strange that even logged in to your server you cannot use http://localhost:631
I’ve tried a few things over he past few days. Some progress, getting warmer but still not resolved.
It occurred to me to try a clean install of cups using apt-get:
$ sudo apt-get purge cups
$ sudo apt-get install cups
$ lynx http://localhost:631
Lynx command successful! I was able to add the printer locally using the web utility, and can print text files locally on my server.
But, when I try to access from a remote computer
web browser: http://server.ip:631
browser: Failed to connect. Though the site seems valid, firefox was unable to establish connection.
Also, I tried to install the printer on my MacBook. The MacOS Printer installer wizard seemed to succeed at detecting the printer and choosing a matching driver for it. But when I try to print:
MacBook: Network Printer «printername» is busy. Will retry «later» (it never succeeds). (MacOS Trouleshooting wizard can not repair.)
Seems like some sort of network configuration problem. I find that odd because I can successfully use port 80 (web page) and port 22 (ssh/scp) from any computer I make available in ufw. I have a ufw allow rule for port 631 with the same syntax as what works for ports 80 and 22. So I am thinking maybe problem with a network setting in a cups config somewhere?
But, when I try to access from a remote computer
[FONT=Courier New]web browser: http://server.ip:631
browser: Failed to connect.
Cool that you got one step further! 🙂
I’ve just enabled remote browsing for cups over my local network, see the working /etc/cups/cupsd.conf attached as a dot text file.
Thank You very much. The config file works better. I’d say we are 99% of the way home! Now I can use the web admin tool from my MacBook and iMac. I was able to set up printer for internet sharing and also set as default printer, so now I see the Printer ready when I type
$
lpq
Brother_HL-5140 is ready
It succeeds at printing a test page from the web utility, but, I still cannot get it to work when I try to print from other computers on my LAN.
It is a USB Printer (non-network ready) so I can only hook it up to the server via the USB port. It is installed as device USB #1.
Any ideas when I set up as a new Printer in my MacBook if I should use LPD or IPP? I’ve tried both but neither seem to want to work. Any thoughts if maybe there is a username problem here? Should I modify cupsd.conf to accept jobs from any user? If so, how do I do this? Thanks.
I was able to set up printer for internet sharing and also set as default printer, so now I see the Printer ready when I type
$
lpq
Brother_HL-5140 is ready
Any ideas when I set up as a new Printer in my MacBook if I should use LPD or IPP?
You should use ipp. The address would be something like : ipp://ip-address-server/printers/brother_hl-5140
And it’s unlikely that you have to change anything else on the server, it’s now all a matter of the configuration on the clients.
I can print when I’m on the same LAN segment as the server, but not from the other segment of my network. There is one router in between. When I am hooked up to the LAN, which I cannot normally do, the MacBook detects it automatically as a Bonjour Shared Printer. When I am in the normal spot (one router away) I cannot get the IPP to work at all. It says the address you gave me is invalid. Yet ssh, http, ftp, all work fine from the other side of the router, not to mention the cups web utility on port 631. I think that is odd. I have everything working great except the printer.
There should be no firewall on the router, just NAT. Normally all of my computers are hooked up to the same LAN, but the other side of the router from the server. Ideas?
Источник
Базовые команды Linux для тестировщиков и не только
Всем привет! Меня зовут Саша, и я больше шести лет занимаюсь тестированием бэкенда (сервисы Linux и API). Мысль о статье у меня появилась после очередной просьбы знакомого тестировщика подсказать ему, что можно почитать по командам Linux перед собеседованием. Обычно от кандидата на позицию QA инженера требуют знание основных команд (если, конечно, подразумевается работа с Linux), но как понять, про какие команды стоит почитать во время подготовки к собеседованию, если опыта работы с Linux мало или вовсе нет?
Поэтому, хоть про это уже и много раз написано, я всё же решился написать ещё одну статью «Linux для новичков» и перечислить здесь базовые команды, которые нужно знать перед любым собеседованием в отдел (или компанию), где используют Linux. Я подумал, какие команды и утилиты и с какими параметрами я использую чаще всего, собрал фидбек от коллег, и скомпоновал это всё в одну статью. Статья условно делится на 3 части: сначала краткая информация об основах ввода-вывода в терминале Linux, затем обзор самых базовых команд, а в третьей части описывается решение типовых задач в Linux.
У каждой команды есть много опций, здесь все они перечислены не будут. Всегда можно ввести `man ` или ` —help`, чтобы узнать о команде подробнее.
Если какая-то команда выполняется слишком долго, её можно завершить, нажав в консоли Ctrl+C (процессу посылается сигнал SIGINT).
Немного о выводе команд
Когда запускается процесс в Linux, создаётся 3 стандартных потока данных для этого процесса: stdin, stdout и stderr. Они имеют номер 0, 1 и 2 соответственно. Но нас сейчас интересуют stdout и, в меньшей степени, stderr. Из названий несложно догадаться, что stdout используется для вывода данных, а stderr — для вывода сообщений об ошибках. По умолчанию при запуске команды в Linux stdout и stderr выводят всю информацию на консоль, однако, если вывод команды большой, может быть удобно перенаправить его в файл. Это можно сделать, например, так:
Если мы выведем содержимое файла man_signal, то мы увидим, что оно идентично тому, что было бы при простом запуске команды `man signal`.
Операция перенаправления `>` по умолчанию использует stdout. Можно указать о перенаправлении stdout явно: `1>`. Аналогично можно указать о перенаправлении stderr: `2>`. Можно эти операции скомбинировать и таким образом разделить обычный вывод команды и вывод сообщений об ошибках:
Перенаправить и stdout, и stderr в один файл можно следующим образом:
Операция перенаправления `2>&1` означает перенаправление stderr туда же, куда направлен stdout.
Еще один удобный инструмент для работы с вводом-выводом (а точнее, это удобное средство межпроцессного взаимодействия) — pipe (или конвейер). Конвейеры часто используются для связи нескольких команд: stdout команды перенаправляется в stdin следующей, и так по цепочке:
Базовые команды Linux
Вывести текущую (рабочую) директорию.
Вывести текущую дату и время системы.
Данная команда показывает, кто залогинен в системе. Помимо этого также на экран выводится uptime и LA (load average).
Вывести содержимое директории. Если не передать путь, то выведется содержимое текущей директории.
Лично я часто использую опции -l (long listing format — вывод в колонку с дополнительной информацией о файлах), -t (сортировка по времени изменения файла/директории) и -r (обратная сортировка — в сочетании с -t наиболее «свежие» файлы будут внизу):
Есть 2 специальных имени директории: «.» и «..«. Первое означает текущую директорию, второе — родительскую директорию. Их бывает удобно использовать в различных командах, в частности, ls:
Также есть полезная опция для вывода скрытых файлов (начинаются на «.«) — -a:
И еще можно использовать опцию -h — вывод в human readable формате (обратите внимание на размеры файлов):
Изменить текущую директорию.
Если не передавать имя директории в качестве аргумента, будет использоваться переменная окружения $HOME, то есть домашняя директория. Также может быть удобно использовать `
` — специальный символ, означающий $HOME:
mkdir
Иногда нужно создать определенную структуру директорий: например, директорию в директории, которой не существует. Чтобы не вводить несколько раз подряд mkdir, можно использовать опцию -p — она позволяет создать все недостающие директории в иерархии. Также с этой опцией mkdir не вернет ошибку, если директория существует.
Опция -r позволяет рекурсивно удалять директории со всем их содержимым, опция -f позволяет игнорировать ошибки при удалении (например, о несуществующем файле). Эти опции позволяют, грубо говоря, гарантированно удалить всю иерархию файлов и директорий (если на это есть права у пользователя), поэтому, их нужно использовать с осторожностью (классический пример-шутка — «rm -rf /«, при определенных обстоятельствах удалит вам если не всю систему, то очень много важных для её работоспособности файлов).
Копировать файл или директорию.
У этой команды также есть опции -r и -f, их можно использовать, чтобы гарантированно скопировать иерархию директорий и папок в другое место.
Переместить или переименовать файл или директорию.
Вывести содержимое файла (или файлов).
Также стоит обратить внимание на команды head (вывести n первых строк или байт файла) и tail (о ней — далее).
Вывести n последних строк или байт файла.
Очень полезной является опция -f — она позволяет выводить новые данные в файле в реальном времени.
Иногда текстовый файл слишком большой, и неудобно выводить его командой cat. Тогда можно открыть его с помощью команды less: файл будет выводиться по частям, доступна навигация по этим частям, поиск и прочий простой функционал.
Также может оказаться удобным вариант использования less с конвейером (pipe):
Вывести список процессов.
Я сам обычно использую BSD опции «aux» — вывести все процессы в системе (так как процессов может быть много, я вывел только первые 5 из них, использовав конвейер (pipe) и команду head):
Многие также используют BSD опции «axjf«, что позволяет вывести дерево процессов (здесь я убрал часть вывода для демонстрации):
У этой команды много различных опций, так что при активном использовании рекомендую ознакомиться с документацией. Для большинства же случаев хватит просто знать «ps aux«.
Послать сигнал процессу. По умолчанию посылается сигнал SIGTERM, который завершает процесс.
Так как процесс может иметь обработчики сигналов, kill не всегда приводит к ожидаемому результату — моментальному завершению процесса. Чтобы «убить» процесс наверняка, нужно послать процессу сигнал SIGKILL. Однако это может привести к потере данных (например, если процесс перед завершением должен сохранить какую-то информацию на диск), так что нужно пользоваться такой командой осторожно. Номер сигнала SIGKILL — 9, поэтому короткий вариант команды выглядит так:
Помимо упомянутых SIGTERM и SIGKILL существует еще множество различных сигналов, их список можно легко найти в интернете. И не забывайте, что сигналы SIGKILL и SIGSTOP не могут быть перехвачены или проигнорированы.
Послать хосту ICMP пакет ECHO_REQUEST.
По умолчанию ping работает, пока его не завершить вручную. Поэтому может быть полезна опция -c — количество пакетов, после отправки которых ping завершится самостоятельно. Ещё одна опция, которую я иногда использую — -i, интервал между посылками пакетов.
OpenSSH SSH клиент, позволяет подключаться к удаленному хосту.
Есть много нюансов в использовании SSH, также этот клиент обладает большим количеством возможностей, поэтому при желании (или необходимости) можно почитать про это более подробно.
Копировать файлы между хостами (для этого используется ssh).
rsync
Также для синхронизации директорий между хостами можно использовать rsync (-a — archive mode, позволяет скопировать полностью всё содержимое директории «как есть», -v — вывод на консоль дополнительной информации):
Вывести на экран строку текста.
Здесь заслуживают внимания опции -n — не дополнять строку переносом строки в конце, и -e — включить интерпретацию экранирования с помощью «\».
Также с помощью этой команды можно выводить значения переменных. Например, в Linux exit code последней завершенной команды хранится в специальной переменной $?, и таким образом можно узнать, какая именно ошибка произошла в последнем запущенном приложении:
telnet
Клиент для протокола TELNET. Используется для коммуникации с другим хостом.
Если нужно использовать протокол TLS (напомню, что SSL давно устарел), то telnet для этих целей не подойдёт. Зато подойдёт клиент openssl:
Решение типовых задач в Linux
Изменить владельца файла
Изменить владельца файла или директории можно с помощью команды chown:
В параметр этой команде нужно отдать нового владельца и группу (опционально), разделенных двоеточием. Также при изменении владельца директории может быть полезна опция -R — тогда владельцы изменятся и у всего содержимого директории.
Изменить права доступа файла
Эта задача решается с помощью команды chmod. В качестве примера приведу установку прав «владельцу разрешено чтение, запись и исполнение, группе разрешено чтение и запись, всем остальным — ничего»:
Первая 7 (это 0b111 в битовом представлении) в параметре означает «все права для владельца», вторая 6 (это 0b110 в битовом представлении) — «чтение и запись», ну и 0 — это ничего для остальных. Битовая маска состоит из трёх битов: самый младший («правый») бит отвечает за исполнение, следующий за ним («средний») — за запись, и самый старший («левый») — за чтение.
Также можно выставлять права с помощью специальных символов (мнемонический синтаксис). Например, в следующем примере сначала убираются права на исполнение для текущего пользователя, а затем возвращаются обратно:
У этой команды есть много вариантов использования, поэтому советую прочитать про неё подробнее (особенно про мнемонический синтаксис, например, здесь).
Вывести содержимое бинарного файла
Это можно сделать с помощью утилиты hexdump. Ниже приведены примеры её использования.
С помощью этой утилиты можно вывести данные и в других форматах, однако наиболее часто могут пригодиться именно такие варианты её использования.
Искать файлы
Найти файл по части имени в дереве каталогов можно с помощью команды find:
Также доступны другие опции и фильтры поиска. Например, так можно найти файлы в папке test, созданные более 5 дней назад:
Искать текст в файлах
Справиться с этой задачей поможет команда grep. У неё есть множество вариантов использования, здесь в качестве примера указан самый простой.
Один из популярных способов использования команды grep — использование её в конвейере (pipe):
Опция -v позволяет сделать эффект grep‘а обратным — будут выводиться только строки, не содержащие паттерн, переданный в grep.
Смотреть установленные пакеты
Универсальной команды нет, потому что всё зависит от дистрибутива Linux и используемого пакетного менеджера. Скорее всего вам поможет одна из следующих команд:
Посмотреть, сколько места занимает дерево директорий
Один из вариантов использования команды du:
Можно менять значение параметра -d, чтобы получать более подробную информацию о дереве директорий. Также можно использовать команду в комбинации с sort:
Опция -h у команды sort позволяет сортировать размеры, записанные в human readable формате (например, 1K, 2G), опция -r позволяет отсортировать данные в обратном порядке.
«Найти и заменить» в файле, в файлах в директории
Данная операция выполняется с помощью утилиты sed (без флага g в конце заменится только первое вхождение «old-text» в строке):
Можно использовать её для нескольких файлов сразу:
Вывести колонку из вывода
Справиться с этой задачей поможет awk. В данном примере выводится вторая колонка вывода команды `ps ux`:
При этом надо иметь ввиду, что awk обладает гораздо более богатым функционалом, так что при необходимости работы с текстом в командной строке стоит почитать об этой команде подробнее.
Узнать IP адрес по имени хоста
С этим поможет одна из следующих команд:
Сетевая информация
Можно использовать ifconfig:
При этом, если, например, вас интересует только IPv4, то можно добавить опцию -4:
Посмотреть открытые порты
Для этого используют утилиту netstat. Например, чтобы посмотреть все слушающие TCP и UDP порты с отображением PID’а процесса, слушающего порт, и с числовым представлением порта, нужно использовать ее со следующими опциями:
Информация о системе
Получить данную информацию можно с помощью команды uname.
Чтобы понять, в каком формате производится вывод, можно обратиться к help‘у данной команды:
Информация о памяти
Чтобы понять, сколько оперативной памяти занято или свободно, можно воспользоваться командой free.
Информация о файловых системах (свободное место на дисках)
Команда df позволяет посмотреть, сколько места свободно и занято на примонтированных файловых системах.
Опция -T указывает, что нужно выводить тип файловой системы.
Информация о задачах и различной статистике по системе
Для этого используется команда top. Она способна вывести разную информацию: например, топ процессов по использованию оперативной памяти или топ процессов по использованию процессорного времени. Также она выводит информацию о памяти, CPU, uptime и LA (load average).
Эта утилита обладает богатым функционалом, так что если вам надо часто ей пользоваться, лучше ознакомиться с её документацией.
Дамп сетевого трафика
Для перехвата сетевого трафика в Linux используется утилита tcpdump. Чтобы сдампить трафик на порте 12345, можно воспользоваться следующей командой:
Опция -A говорит о том, что мы ходим видеть вывод в ASCII (поэтому это хорошо для текстовых протоколов), -i any указывает, что нас не интересует сетевой интерфейс, port — трафик какого порта дампить. Вместо port можно использовать host, либо комбинацию host и port (host A and port X). И еще полезной может оказаться опция -n — не конвертировать адреса в хостнеймы в выводе.
Что если трафик бинарный? Тогда нам поможет опция -X — выводить данные в hex и ASCII:
При этом надо учитывать, что в обоих вариантах использования будут выводиться IP пакеты, поэтому в начале каждого из них будут бинарные заголовки IP и TCP. Вот пример вывода для запроса «123» посланного в сервер, слушающий порт 12345:
Источник