Tag Archives: Linux

Настройка почтового сервера с веб-потой. Webmail on your Debian server: exim4 + dovecot + roundcube


2015 UPDATE: I discovered that dovecot now uses MUCH longer passwords than it used to, and the database tables I’d found online WILL FAIL to authenticate (they truncate your passwords!). Fixed below

95% of linux configuration on Debian servers is simple, well-documented, well-designed, easy to do, with only a tiny bit of reading of docs.

Sadly, “making email work” is most of the 5% that’s: nearly impossible, very badly designed, badly packaged/documented. This OUGHT to take an hour or two, in practice it takes ONE WEEK to setup. WTF? In 2014? Unacceptable!

So I took several incomplete/broken guides, dozens of pages of help and advice, and synthesized this complete, step-by-step guide. This should get you the webmail you actually want (!) in an hour or less.

What I wanted / what you probably want

These days, no-one has “only one domain”. If you’re running your own server(s), you should have many domains on a single server – this is normal, and Debian has long supported this out-of-the-box.

We want:

     * Multiple domains using this for email (e.g. @company.com, @othercompany.com, @company-other-spelling.org)

    * Webmail on your server (for anyone in the org to access email)

    * Aliases / redirects for some email addresses (e.g. so you can redirect “support@” to a particular person)

    * DO NOT create “linux users” for every email user – it’s a huge security hole, and a massive pain in the ass for the sysadmin

    * DO NOT do mail-relaying

NB: when you’re supporting a significant number of users, and this is their main email address, you should do mail-relaying. I didn’t need it, so I haven’t tested it, and removed it from my instructions.

So, here we go…

How we’ll do it

We need five pieces of server-software:

Web server
Database server
Email server (MTA)
IMAP server
Webmail server

When someone goes to a special web address, the webserver will open the webmail. When you login to webmail, it will talk to the IMAP server, which gives you a list of all your emails and lets you read them. When you try to send email (or receive it), the IMAP server will use the email server to do the send/receive work.

To make logins work without creating linux users for every possible account (and what if you have “joe@domain.com” and “joe@other-domain.com” ?? How do you fix that?) … we’ll use the database server to manage ALL logins and usernames/passwords.

Note: most of the other server-software ALREADY needs to use database software for their internal configuration – so we’ll have a database server hanging around already. Might as well use it!

We are using:

Debian = your OS (Ubuntu appears to be identical for all steps, but I haven’t tested it)
Apache v2 = web server (nginx etc would be faster, but Apache is the super-common server that all software already integrates with)
MySQL v5 = database server (postgres should be ALMOST identical config)
Exim v4 = your email-server
Dovecot = your IMAP server
Roundcube = your webmail server

To emphasize, we are NOT using:

NOT using: Postfix (slightly less common than exim?)
NOT using: Courier (WAY harder to configure/debug than Dovecot)
NOT using: Squirrel (ugly, hard to use), Horde (WAY too complicated for webmail)

Thanks to

The inspiration/starting point for this guide is Alex’s 4 years old exim3 “rough notes” – but don’t use this directly, it’s missing MORE THAN 50% of what you need!. I would have been lost with Alex’s starting point – way too much to discover – so I’m very grateful to him (you should be too :)).

I had done enough sysadmin in the past that I was confident I could fill in the bits Alex ommitted. I did – but it took a lot of time/effort :(.

Unexpected mentions

Exim4 – I hate exim configuration. It’s insane. Debian’s authors have tried to “sanitize” it but it will still make you weep.

Exim4 – …but: the “manual” on their website is comprehensive. It’s hard to read (too much jargon, too academic, too dense) – but it’s detailed and accurate. I hit a few very subtle problems that I eventually fixed by reading the manual chapters. But I had to re-read 4 or 5 times to understand what they were trying to say :(.

Dovecot – these guys maintain an amazingly good “check it’s working, and if not, isolate the problem” page. Every project should have one of these! It works *no matter what setup you’re using* (most projects say “if you didn’t compile from source, we won’t help you. Jog on!”. Have a look at this beauty … and also the super-short version (less useful).


Debian package maintainers did a bad job with the email packages. I believe this is a reflection of how exceptionally badly-designed the email apps are for linux: they defeated even the Debian maintainers!

Note: When you need multiple pieces of an app to make it work, Debian usually includes a set of “simple install” pacakges that automatically install the different combinations for you. That doesn’t work here – you have to be psychic (!) and know everything before you start. Ugh.

You need to install ALL of:

apt-get install apache2-mpm-prefork
(Some of these email servers require PHP; PHP is crappy and requires mpm-prefork (the ‘slow’ version of Apache))
apt-get install mysql-client
(should auto-install something like: mysql-common + mysql-client-5.5)
apt-get install mysql-server
(should auto-install something like: mysql-server-5.5 + mysql-server-core-5.5)
apt-get install exim4
apt-get install exim4-base
apt-get install exim4-config
apt-get install exim4-daemon-heavy
(there’s an “exim4-mysql” that might be sufficient to replace this, but I gave up: there are way too many exim4 packages, and no help for installing the “correct” set, so … just pick this and get the lot!)
apt-get install dovecot-core
apt-get install dovecot-imapd
apt-get install dovecot-mysql
apt-get install roundcube
apt-get install roundcube-core
apt-get install roundcube-mysql

Setup: DNS

You should know about this already: you need an “MX” record on your DNS server, and it needs to point to your main server where you’ll run your email, web, etc.

Most people these days used hosted DNS, so the method to set this up will be specific to your hosting provider. It’s usually very simple.

Setup: Web server

By default, Roundcube sets up an over-the-top config: it creates an email server on every single website hosted on your server, and makes them all available at once.

Following the idea of http://www.cpierce.org/2012/04/roundcube-for-your-debian-squeeze-mail-server/, I used a much simpler, easier-to-maintain, and easier-to-secure setup. This is documented in the Debian package docs too.

Create a web address for your webmail

If you have multiple websites hosted on your server, you SHOULD have a separate file for each inside /etc/apache2/sites-available. e.g.:


For each domain that you want to give webmail to, edit the file and ADD the following:

Note: replace “[the domain name]” with the domain name, e.g. “domain1.com”


TinyMCE is a WYSIWYG text-editor for HTML emails. I hate it. It had a long history of being insecure, buggy, slow, and hard to use. So I disable it:

Edit /etc/roundcube/apache.conf:

Comment out these lines:

Setup: create databases

Create your databases. From the command-line, you can do something like:

…or use your preferred softare (e.g. phpMyAdmin).

Create the database

Create the tables for email-accounts and config

NOTE: some places on web list varchar(50) for the password – with MySQL and dovecot latest, that’s too short, and the DB will return truncated passwords, blocking your users from logging in

Create a database-account to access the database

Note: that is not an email address, it’s a MySQL user account.
Note: this account will ONLY be accessible by our software running on the server; you cannot access this account remotely (over the internet).

Create your first email account and domain

Note: this password is used over the internet when you login to webmail – so pick a good one! This has to be secure!

Create a redirector for an email address

Note: only set this up if you actually want a redirect.

Setup: Configure Exim4

When you install Exim4, make sure you chose the “split” packages. If not, you can fix that now by running:

See the next section for the answers to fields, but edit that file afterwards to check you got it right.

Debian: set the global / initial Exim config

NB: these are the settings filled out by “dpkg-reconfigure exim4-config”. Here’s what your file should look like:

Edit: /etc/exim4/update-exim4.conf.conf

Note: replace “[YOUR DOMAIN 1]” with e.g. “my-company.com”, or “mail.company.com” – you must have one of these for EACH of your domains which has email accounts.
Note: replace “[PUT YOUR SERVER’s IP ADDRESS HERE]” with e.g. “” (whatever your public internet address is)

Setup Exim: Macros

ADD the following to /etc/exim4/conf.d/main/000_localmacros:

ADD the following to /etc/exim4/conf.d/main/01_exim4-config_listmacrosdefs:

Note: “hide mysql_servers” isn’t “hiding” anything – it’s an ESSENTIAL step! It actually means “use this database server”. Terrible config name :(.

Setup Exim: Routers

CREATE the file /etc/exim4/conf.d/router/360_exim4-config_mysqlusers:

Either DELETE this file, or comment-out all lines /etc/exim4/conf.d/router/400_exim4-config_system_aliases:

CREATE this file /etc/exim4/conf.d/router/401_exim4-config_mysql_aliases:

Setup exim: Transports

CREATE / OVERWRITE the file /etc/exim4/conf.d/transport/30_exim4-config_dovecot:

Setup exim: Auth

CREATE the file /etc/exim4/conf.d/auth/20_exim4-config_mysql-authenticator:

Setup: Configure Dovecot

When installing the dovecot apts, make sure you chose the “split files” option (exactly as with Exim4). It makes life easier. If you got this wrong, run:

Note: Dovecot installs with almost everything “Commented out”. Many of these options exist commented-out, you should find them in the config file, and put your “new” values on the line below, so it’s easy in future to find them and see which “defaults” you changed.

Dovecot: find your “mail” linux user

For security, you want a “mail” user account that runs your server-software, and has restricted access to your server. Debian auto-creates this, but you need to find out what uid and gid it has.

To find these out do:

…and find the line something like:

the first 8 is your uid, the second 8 is your gid (could be different numbers on your server)

Dovecot: all config files

ADD to the file /etc/dovecot/dovecot.conf:

Add to the file /etc/dovecot/conf.d/10-mail.conf:

ADD to the file /etc/dovecot/conf.d/10-auth.conf:

ADD to the file /etc/dovecot/dovecot-sql.conf.ext:

Note: replace [YOUR UID] and [YOUR GID] with correct numbers (that you found out using cat /etc/passwd)

Setup: Configure Roundcube

EDIT the file /etc/roundcube/main.inc.php:

Note: replace “[YOUR MX RECORD]” with the MX address you put on your DNS server at the very start. e.g. “mail.my-domain.com”.

In that file, there are instructions on how to make it automatically calculate the address using %n, %d, etc. If your MX records for your different domains follow the same pattern (e.g. they are all “mail.my-domain.com”), and your webmail login addresses all follow the same pattern (e.g. “wemail.my-domain.com”), you can put one string here and it will automatically log people into the right server in every case, based on the URL they visited.


Now you’ve set it up, you MUST restart the web and email servers.

You must ALSO do this everytime you change any config files!

Exim may output a “paniclog”. If so, read it, fix it – and then manually delete the paniclog file, or else you’ll keep getting fake warnings every time you restart exim.

Debugging – making it work!

You’ve got a lot to test here!

Test exim

receiving emails

Pick an email address that you added to the “email_accounts” database, and try sending email to it while logged-in to server command-line:

…this will give a COMPLETE list of what exim is doing, and it will tell you every decision it made along the way. It should eventually decide the address is “routeable” and OK it.

If that looks OK, try sending an email from your normal email account (e.g. your Hotmail / Gmail / Yahoo.com address). Wait a minute, then check the server to see if it crashed trying to receive the email, by checking the logfiles.

Check exim’s logfiles

Exim will put its logfiles in /var/log/exim4. Check for errors using:

(if there’s a lot of errors, you’ll have to cat the whole thing)

If it rejected the email, it will send a bounce-back to your email provider (yahoo/gmail/etc), and it will ALSO put some info into:

sending emails

…I waited until I had webmail (Roundcube) working before trying this…

Any other Exim problems?

If exim is working, but its blocking/rejecting/losing emails, it will “freeze” them after the first failure. You need to “unfreeze” (i.e. retry) each email to see if you’ve fixed the problem.


Here is a list of commands to help: http://bradthemad.org/tech/notes/exim_cheatsheet.php

Test Dovecot

Dovecot’s maintainers have written an excellent step-by-step guide to testing it, with copy/pasteable command-lines

Note: to make this work, I had to install telnet: “apt-get install telnet-client”

Test Roundcube

Go to the web-address you configured at the very start (e.g. “webmail.your-domain.com”). It should give you a login page for Roundcube.

Login using the user-account you crated in MySQL at the start, using the FULL email address, e.g.:

Username: “joe@mydomain.com”
Password: “password – choose a good one”

If you set things up correctly, following my steps above, it should NOT ask you for an IMAP server. If it does … go back and read this post more carefully.

You should find yourself in webmail, able to send emails, and receive them.

If it all works … speed it up!

Out of the box, Roundcube runs very, very, very slowly … because it checks lots of different passwords before asking MySQL to check the password.

Fortunately there’s a very quick fix here: http://jrs-s.net/2013/07/14/slow-performance-with-dovecot-mysql-roundcube/.

After doing that, I found webmail go from “takes 5 seconds per click” to “most clicks have immediate effect” (on my fast broadband).

What you should do next…

This setup gets you decent, working, webmail. This is the hardest bit!

But it’s missing some core features you’ll want to add next:

Reduce incoming spam: install SpamAssassin or similar
Secure the webmail connection: buy an SSL certificate, install it in Apache, force webmail to use SSL/TLS.
Secure the IMAP connection: the setup above allows anyone to IMAP to the server from public internet. This allows you to use Outlook etc as a mail client. But if you *only* want to allow Webmail, you can edit your Dovecot configs and change the “listen” setting to only listen on / localhost. This will allow Roundcube to connect (it’s on the same server) but will block internet clients.

…those should be easy to find separate guides for. Good luck.

2016 Update

Michael Radhuber reports following changes needed for Ubuntu 15.10 (may be needed for some other Debian’s, but I didn’t need them with stock Debian):

    Only two things I might add:
    1. In the file /etc/dovecot/conf.d/auth-sql-conf.ext uncomment driver and set it to mysql
    2. /etc/dovecot/conf.d/10-mail.conf uncomment first_valid_uid and set it to [your_uid] (ie. 8). If you need to do the same for first_valid_gid

Источник: http://t-machine.org/index.php/2014/06/27/webmail-on-your-debian-server-exim4-dovecot-roundcube/

Не работает системный Cron (Linux Ubuntu)

Недавно столкнулся с проблемой запуска Cron. Как оказалось, почему-то системный Cron не срабатывал. С виду — было все нормально. Уже и программные части перепроверил. А оно молчит и не выполняется.

Как оказалось, маленькая опечатка в настройках cron приводила к его не запуску…. И система ничего не выдавала в видимом виде.

Если у Вас не запускается системный Cron, проверьте его синтаксис:

После этого, Вы можете проверить, что находится в очереди Cron.


Урок 6 Команды Linux

Команды Linux

Разработка и создание сайтов, интернет-магазинов, веб-приложений, порталов, лэндингов, мобильных приложений (Киев)



Горячик клавиши mc и mcedit

Часто приходится работать в терминале на прямую. Открываешь огромный файл редактором mc и редактируешь, смотришь. Однако, когда файлы размеров в много сотен тысяч строк, без знания комбинаций клавиш очень тяжело работать.

В мануалах и справках клавишу Ctrl обозначают как C, а M — это клавиша Alt.
Если команда пишеться через «-» это означает что они нажимаются совместно.
Если через пробел, то после нажатия первой (отпуская первую) нажимают следующую.

В главном окне mc (midnight commander)

C-O переключение на subshell и обратно
M-c сменить текущий каталог (возникает необходимость когда в командной строке уже что-то набрано)


В mcedit:

F3 начать выделение / закончить выделение
F5 скопировать выделенный текст
F6 переместить выделенный текст
F8 удалить выделенный текст
M-L перейти к строке с номером
M-B перейти к парной скобке (полезная вещь для программеров, и не только)
С-F скопировать выделенный блок в файл буфер
C-U отменить последнее действие
С-K удалить до конца строки от текущей позиции курсора
С-Y удалить строку
C-Z перейти к началу предыдущего слова
C-X перейти к концу следующего слова

Удаление «1С:Підприємство» на сервере linux(Ubuntu)




Источник: http://1cprovse.blogspot.com/2014/08/1-linuxubuntu.html

Установка OpenOffice в Linux Ubuntu

Автор: Рудюк С . А.

E-Mail: rs@corp2.net

Скачиваем OpenOffice с сайта: http://www.openoffice.org/download/index.html

Удаляем LibreOffice:

Переходим в папку, куда вы распаковали закачанный OpenOffice:

Устанавливаем все пакеты:

Устанавливаем интеграцию с рабочим столом:

Автор: Рудюк С . А. https://corp2.net

Не запускается виртуальная машина Windows 8, Windows Server 2012 в Linux Ubuntu 15.04

Автор: Рудюк С . А.

E-Mail: rs@corp2.net

После обновления Linux Ubuntu на последнюю версию — 15.04 одна из виртуальных машин c Windows 8 стала выдавать такую ошибку.

Win81_VBox_errПосле поисков в Гугл, нашел способ лечения. Под административными правами запускаете команду:

Где vmname — регистрационное название виртуальной машины в Virtualbox.

После этого, необходимо запустить Виртуалбокс из админа:

В результате, Виндовс должен загружаться без проблем.

P.S. Так же, следует обратить внимание, что после обновления операционной системы пришлось перекомпиливать драйвера Virtualbox. Благо, делается это очень просто:

Автор: Рудюк С . А. https://corp2.net

Установка последней версии Remmina в Ubuntu. Настройка RDP подключения к Windows 8


В этой статье хочу рассказать о клиенте удаленного рабочего стола Remmina.

Коротко о программе Remmina.

Remmina — клиент для удаленного доступа. Использует FreeRDP в качестве RDP клиента. Кроме RDP поддерживает протоколы: SFTP, SSH, NX, VNC, VNCI и XDMCP. Поддержка протоколов расширяется плагинами.
Данный клиент установлен по умолчанию во всех дистрибутивах Ubuntu и производных от неё.
Во всех текущих версиях Ubuntu на данный момент используется версия 0.99, которая была выпущена в 2010 году:
LinuxRussia_0057Многие, подключившись с помощью Remmina по rdp к windows, ловят различные баги.
Какие же проблемы с этой старой версией встречаются?
Из моих проблем:
— Вырвиглазный рендеринг шрифтов. Шрифты выглядят просто ужасно. Никакие настройки не помогают.
— Очень неприятный баг с курсором мышки. Он не меняется, используется стандартный Ubuntu. То есть выделяя текст, или растягивая окно, вы не увидите изменений курсора.
— Не работал двухсторонний буфер обмена.
— Не работало назначение общей папки.Еще встречаются проблемы с тем, что не все символы клавиатуры работают правильно.К чему я это описал?
Очень мало информации об этом клиенте, следовательно многие могли подключиться, увидеть эти проблемы, почитав местные форумы, разочароваться в этом клиенте и перестать им пользоваться.
Поэтому хочу поделиться информацией, что эти баги устранены, но в новой — последней версии.

Нет смысла искать какие-то конфигурации по форумам или команды в терминале для решения этих проблем. Все эти ошибки — это баги самого клиента, которые были устранены в последней версии программы. Следовательно, нужно просто обновить наш клиент и плагин RDP.

Установка последней версии Remmina в Ubuntu.

Для Ubuntu есть репозиторий на ланчпад, где добавляются последние версии remmina и rdp плагина. В репозитории есть пакеты только для версий 14.04 — 15.04.

Чтобы установить последнюю версию Remmina в Ubuntu откройте терминал и выполните следующие команды:

Для Ubuntu 12.04 попробуйте такой фокус:
Как установить программу из репозитория, в котором нет пакетов для вашей версии дистрибутива Ubuntu

Всё. Теперь последняя версия Remina установлена.

Если нужно удалить программу, то выполните следующие команды:

Настройка RDP подключения к Windows 8.

Давайте подключимся по RDP к Windows 8.

Настройка на Windows 8.

Заходим в «Система» — «Настройка удаленного доступа», на вкладке «Удаленный доступ» разрешаем удаленный подключения к этому компьютеру.


Не забудьте задать текущему пользователю пароль, или создайте другого пользователя для удаленного подключения. Тогда вам надо будет еще и «Выбрать пользователей» нажать и там выбрать созданного пользователя.

Вот и всё. Теперь нужно лишь узнать ip компьютера в локальной сети:


Настройка на windows 8 на этом закончилась.

Настройка подключения к windows 8 на Ubuntu.

Открываем Remmina, создаем новое подключение.
Заполняем Название (удобное Вам).
В поле Сервер вписываем ip компьютера c Windows 8. Также вписываем имя пользователя и пароль. Всё. Сохраняем и подключаемся.

Кроме того можно отредактировать еще качество картинки, я обычно «Хорошее» выбираю:

LinuxRussia_0060Вы всегда можете отредактировать данные параметры, просто нажав на соединении правой кнопкой мыши и выбрав «правка».

Кроме того, в настройка Remmina (CTR-P) можно качество отрегулировать:

При первом подключении не забудьте согласиться на получение сертификата:

Вот и всё, подключаемся.

Вот так выглядит картинка.
Нормальные шрифты и курсор меняется, нет зависания картинки при старте подключения. Работает всё шустро, нет задержек.
Можно вполне себе работать, использую компьютер с windows как тонкий клиент:

И мой сайт хорошо выглядит:
И еще один момент, чтобы нормально срабатывали комбинации клавиш, такие как смена раскладки или alt-f4, нужно, чтобы была зажата данная опция в меню:

Вот и всё.

Плагины к Remmina.

По умолчанию в Remmina доступно мало протоколов удаленного доступа:


VNC плагин не ставьте, он работать не будет.
Из рабочих плагинов можно поставить для протоколов NX и XDMCP:

sudo apt-get install remmina-plugin-nx remmina-plugin-xdmcp

Перезапустить Remmina и в окне нового подключения станут доступны новые протоколы:


XDMCP не использовал, поэтому ничего сказать не могу, но по сообщения, работает ужасно.

Источник: http://www.linuxrussia.com/2015/06/remmina-ubuntu-rdp-windows-8.html

Установка антивируса clamav в Linux

Автор: Рудюк С . А.

E-Mail: rs@corp2.net

Linux достаточно устойчив к воздействию вирусов. Тем не менее спокойней, когда установлен антивирус и проверяет программы в реальном времени.

Установка антвируса Clamav:

Обновляем базы данных антивируса:

Стартуем антивирус:

Автор: Рудюк С . А. https://corp2.net

Использование PHP из командной строки

Начиная с версии 4.3, РНР поддерживает новый SAPI-тип (Server Application Programming Interface) под названием CLI, что означает Command Line Interface. Как следует из названия, главной задачей этого SAPI-типа является разработка оболочки/shell (или рабочего стола) приложений с помощью РНР. Имеются весьма небольшие отличия CLI SAPI от других SAPI, которые будут далее рассмотрены в этой главе.

CLI SAPI был выпущен в первый раз с PHP 4.2.0, но тогда это был эксперимент, и нужно было явно включать его командой --enable-cli при запуске ./configure. Начиная с PHP 4.3.0, CLI SAPI больше не является экспериментальным и всегда встроен и устанавливается как двоичный исполняемый файл php (называется php.exe в Windows).

Существенные отличия CLI SAPI от других SAPI:

  • В отличие от CGI SAPI, никакие шапки/headers не записываются в вывод.Хотя в CGI SAPI имеется способ подавления HTTP-шапок, эквивалентного переключателя для их включения в CLI SAPI нет.
  • Имеются определённые директивы php.ini, которые переопределены в CLI SAPI, поскольку они не имеют смысла в среде окружения оболочки:

Таблица 24-1. Переопределение php.ini-директив
Директива CLI SAPI- значение по умолчанию Комментарий
html_errors FALSE Бывает довольно сложно прочитать в оболочке сообщение об ошибке, наполненное всеми этими бессмысленными HTML-тэгами, поэтому по умолчанию значение этой директивы FALSE.
implicit_flush TRUE Желательно, чтобы любой вывод из print(), echo() и компании немедленно записывался в вывод, а не отправлялся в какой-нибудь буфер. Вы всё ещё можете пользоваться буферизацией вывода, если хотите поработать со стандартным выводом.
max_execution_time 0 (unlimited) Из-за бесконечно больших возможностей использования PHP в среде окружения оболочки, максимальное время выполнения не ограничено. В то время как приложения, написанные для web, выполняются в течение долей секунды, приложения оболочки пытаются занять для своего выполнения максимальное время.
register_argc_argv TRUE Глобальные переменные PHP $argc (количество аргументов, передаваемых приложению) и $argv (массив текущих аргументов) всегда регистрируются и заполняются соответствующими значениями при использовании CLI SAPI.

Примечание: Эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).

  • Легче работать в среде оболочки, когда определены следующие константы:
    Таблица 24-2. Специфические CLI-константы
    Константа Описание
    STDIN Уже открытый поток в stdin. Она хранит открывшего её

    STDOUT Уже открытый поток в stdout. Она хранит открывшего её

    STDERR Уже открытый поток в stdout. Она хранит открывшего её

    Имея всё это, вы не должны, например, самостоятельно открывать поток для stderr, а просто используете константу вместо ресурса потока:

    Вам не нужно явно закрывать эти потоки, это делается РНР автоматически.

  • CLI SAPI не изменяет текущую директорию на директорию исполняемого скрипта!Пример, показывающий отличие CGI SAPI:

    Когда используется CGI-версия, на выходе будет:

    Это ясно показывает, что PHP изменяет свою текущую директорию на директорию исполняемого скрипта.

    Использование CLI SAPI даёт:

    Это даёт большую гибкость при написании утилит командной строки на PHP.

    Примечание: CGI SAPI поддерживает поведение CLI SAPI с помощью ключа -C при запуске из командной строки.

Список опций командной строки исполняемого файла PHP может быть получен в любое время путём запуска PHP с ключом -h:

CLI SAPI имеет три разных способа получения PHP-кода, который нужно выполнить:

  1. Сказать PHP выполнить определённый файл.

    Оба способа (с/без использования переключателя -f) выполняют данный файл my_script.php. Вы можете выбрать для выполнения любой файл, названия ваших файлов скриптов PHP не обязаны заканчиваться расширением .php, а могут иметь любое имя или расширение.

  2. Передать PHP код для выполнения непосредственно из командной строки.

    Особого внимания требует замена переменных оболочки и использование кавычек.

    Примечание: Просмотрите пример внимательно, нет начальных и конечных тэгов! Переключателю -r они просто не нужны. Использование их в данном случае приведёт к ошибке разборщика.

  3. Предоставить PHP-код для выполнения через стандартный ввод (stdin).Это позволяет динамически создавать PHP-код и передавать его экзешнику, как показано в данном (надуманном) примере:

Вы не можете комбинировать эти три способа при выполнении кода.

Как и в любом приложении оболочки, не только сам PHP, но и ваши скрипты PHP также принимают аргументы. Количество передаваемых в скрипт аргументов в РНР не ограничивается (оболочка имеет ограничение на количество передаваемых символов).
Аргументы, передаваемые в ваш скрипт, доступны через глобальный массив $argv. Нулевой индекс всегда содержит имя скрипта (которое является символом - в случае, когда PHP-код приходит со стандартного ввода или с использованием ключа командной строки -r).
Вторая регистрируемая глобальная переменная это $argc, которая содержит количество элементов в массиве $argvне количество аргументов, передаваемых в скрипт).

Если аргументы, которые вы хотите передать в скрипт, не начинаются с символа дефиса (-), ничего специально наблюдать не надо. Передача в скрипт аргумента, начинающегося с - , создаст проблемы, поскольку PHP думает, что должен сам их обработать. Чтобы предотвратить это, используйте в качестве сепаратора аргументов списка --. После того как аргумент будет разобран PHP, каждый последующий аргумент передаётся в ваш скрипт без изменений/не разобранным.

Однако, вот другой способ использования PHP для скриптинга оболочки. Вы можете написать скрипт, первая строка которого начинается с #!/usr/bin/php, а затем идёт нормальный PHP-код, содержащийся между начальным и конечным тэгами PHP, и соответствующим образом устанавливаются атрибуты выполнения файла. Таким способом он может быть исполнен как нормальный скрипт оболочки или perl:

Приняв, что файл называется test и находится в текущей директории, мы можем выполнить:

Как вы видите, ничего особо не нужно делать при передаче параметров в скрипт, который начинается с -.

Таблица 24-3. Опции командной строки
Опция Описание
-s Отображать синтаксис в цвете.Эта опция использует внутренний механизм разбора файла, производит его расцвеченную HTML-версию и записывает её в стандартный вывод. Заметьте, что генерируется лишь блок <code> [...] </code> HTML-тэгов без HTML-header.

Примечание: Эта опция не работает вместе с опцией -r.

-w Отобразить исходный текст без комментариев и пробелов.

Примечание: Эта опция не работает вместе с опцией -r.

-f Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения.
-v Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например:

-c С помощью этой опции можно либо специфицировать директорию для поиска php.ini, либо специальную директорию INI-файла (который не обязательно называется php.ini), например:

-a Запускает PHP интерактивно.
-d Эта опция позволяет устанавливать специальное значение для каждой директивы конфигурации, которые допускаются в php.ini. Синтаксис таков:


-e Генерирует расширенную информацию для debugger/profiler.
-z Загружает Zend-расширение. Если задано только имя файла, PHP пытается загрузить данное расширение из текущего пути по умолчанию к библиотеке в вашей системе (обычно специфицируется как /etc/ld.so.conf в Linux-системах). Передача filename с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное filename с информацией директории скажет PHP — попытаться загрузить расширение относительно текущей директории.
-l Эта опция предоставляет удобный способ выполнения проверки синтаксиса данного PHP-кода. В случае успеха — текст No syntax errors detected in <filename> записывается в стандартный вывод, а return-код оболочки будет 0. При неудаче — текст Errors parsing <filename> вместе с внутренним сообщением разборщика об ошибке записывается в стандартный вывод, а return-код оболочки будет 255.Эта опция не будет находить фатальные ошибки (вроде не определённых функций). Используйте -f, если хотите проверить также и наличие фатальных ошибок.

Примечание: Эта опция не работает вместе с -r.

-m Используя эту опцию, PHP печатает на вывод встроенные (и загруженные) модули PHP и Zend:

-i Эта опция командной строки вызывает phpinfo() и печатает на вывод результаты. Если PHP не работает правильно, советуем выполнить php -i и посмотреть, выводятся ли сообщения об ошибке до или вместо таблиц информации. Имейте в виду, что вывод будет на HTML и, следовательно довольно сумбурным.
-r Эта опция позволяет выполнять PHP прямо в командной строке. Начальный и конечный тэги PHP (<?php и ?>) не нужны и вызывают ошибки разборщика.

Примечание: Нужно проявлять внимание при использовании этой формы PHP, чтобы не было противоречий с заменой переменных командной строки, выполняемой оболочкой.

Пример, выводящий ошибку разборщика:

Проблема здесь в том, что sh/bash выполняет замену переменной даже при использовании двойных кавычек ". Поскольку переменная $foo вряд ли определена, она ни во что не разворачивается, что в результате даёт код, передаваемый в PHP для выполнения, фактически прочитанный:

Корректным будет использовать одинарные кавычки '. Переменные в строках, заключённые в одинарные кавычки, не разворачиваются при работе sh/bash.

Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены…

-h С помощью данной опции вы можете получить информацию о действующем списке опций командной строки и небольшое описание их работы.

Исполняемый файл PHP может быть использован для запуска PHP-скриптов абсолютно независимо от web-сервера.
Если вы работаете под Unix, вы должны добавлять специальную первую строчку в ваши PHP-скрипты и делать их исполняемыми, чтобы система знала, какая программа должна выполнять эти скрипты.
Под Windows вы можете ассоциировать php.exe с опцией двойного щелчка по файлам .php либо сделать batch-файл (.bat) для запуска скрипта через PHP. Строка, добавленная в начало скрипта для работы под Unix, не помешает под Windows, поэтому вы можете писать таким образом межплатформенные программы. Ниже дан пример простой РНР-программы для выполнения из командной строки.

Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php)

Здесь мы используем специальную первую строку для указания на то, что этот файл должен быть запущен в PHP. Здесь мы работаем с CLI-версией, поэтому не выполняется вывод HTTP-шапок/header. Имеются две переменные, которые вы можете использовать при написании РНР-приложений для командной строки: $argc и $argv. Первая — это количество аргументов плюс 1 (имя запущенного скрипта). Вторая — это массив аргументов, начиная с имени скрипта с индексом ноль ($argv[0]).

Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был --help, -help, -h или -?, мы печатаем help-сообщение, выводя имя скрипта динамически. Если мы получили какой-либо другой аргумент, мы выводим его (echo).

Если вы хотите выполнить вышеприведённый скрипт под Unix, вам необходимо сделать его executable и просто вызвать как script.php echothis или script.php -h. Под Windows вы можете создать batch-файл для выполнения этой задачи:

Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat)

Приняв, что вы назвали программу script.php и что ваш php.exe находится в c:\php\php.exe, этот batch-файл запустит её с добавленными вами опциями: script.bat echothis или script.bat -h.

Источник: http://phpclub.ru/manrus/feat/commandline.html

Разработка и создание сайтов, интернет-магазинов, веб-приложений, порталов, лэндингов, мобильных приложений (Киев)