二、被調用的腳本有沒有執行權限。php
exec("/**/**.sh > /dev/null 2>&1 &"); html
示例 linux
程序代碼: php添加定時atweb
<?php shell
$str = "#!/bin/bash\n";
$str .= "echo 'king' >/home/apache.log\n";
$str .= "/bin/ls >>/home/apache.log \n";
file_put_contents("/var/www/html/fantasia/server/atq", $str);數據庫
$re = system("sudo at -f /var/www/html/fantasia/server/atq now + 1 minute 2>&1", $res);
var_dump($res);
var_dump($re);apache
?>ubuntu
注意:數組
sudo: 當用戶權限不足是,可使用sudo進行操做 配置過程: 附1 安全
2>&1: 錯誤重定向 不論是正確仍是錯誤,都將輸出結果信息。
at命令: at命令的使用格式
配置sudo過程當中的問題:
4. 重啓Apache
是用戶apache得到權限
5 用useradd命令添加賬號apache,提示「user apache exists" ,
可是 在root下用 su apache時,
提示This account is currently not available,
usermod -s /bin/bash apache
後記:shell執行php
一,爲何咱們要在命令行下運行php腳本呢?
我的理解,主要有二個緣由:
1,利用crontab去跑php,能夠給服務器減壓,固然在這裏有一個條件,就是實時性要求不高。好比:sns中的好友動態,這個實時要求不高,可是數據量比較大,這個時候定時跑的話,會給web服務器,數據庫服務器分擔不小的壓力。
2,就是咱們要定時去完成某一事情,好比:我要刪除一個月前,用戶留言,這個時候,寫的php腳本在crontab去執行,一天跑一次就好了。而不是手動去執行php程序。
二,命令行下執行帶參數php,並取得參數
有一點很重要,就是命令行下執行php,是不走apache等這類東西的,沒有什麼http協議,全部get,post傳參數根本不起做用,而且還會報錯,以下:
zhangying@ubuntu:~$ php test.php?aaa=bbb
Could not open input file: test.php?aaa=bbb
一般狀況下,不須要向定時跑的php腳本傳參數,但有的時候,是要的。
1,test.php測試文件,很簡單吧
2,命令行下調用
這種傳參的方式,根shell腳本真的很像,
zhangying@ubuntu:~$ sh c1.sh aaa bbb
我向c1.sh傳了二個參數aaa bbb,shell會獲得三個參數,$0爲文件自己,$1爲參數1,$2爲參數2。不一樣的是,php獲得的是以數組的形勢,而shell不是。
附件1 sudo配置
一. 使用 su 命令臨時切換用戶身份
一、su 的適用條件和威力 su命令就是切換用戶的工具,怎麼理解呢?好比咱們以普通用戶beinan登陸的,但要添加用戶任務,執行useradd ,beinan用戶沒有這個權限,而這個權限偏偏由root所擁有。解決辦法沒法有兩個,一是退出beinan用戶,從新以root用戶登陸,但這種辦法並非最好的;二是咱們沒有必要退出beinan用戶,能夠用su來切換到root下進行添加用戶的工做,等任務完成後再退出root。咱們能夠看到固然經過su 切換是一種比較好的辦法; 經過su能夠在用戶之間切換,若是超級權限用戶root向普通或虛擬用戶切換不須要密碼,什麼是權力?這就是!而普通用戶切換到其它任何用戶都須要密碼驗證; 二、su 的用法: su [OPTION選項參數] [用戶] -, -l, ——login 登陸並改變到所切換的用戶環境; -c, ——commmand=COMMAND 執行一個命令,而後退出所切換到的用戶環境; 至於更詳細的,請參看man su ; 三、su 的範例: su 在不加任何參數,默認爲切換到root用戶,但沒有轉到root用戶家目錄下,也就是說這時雖然是切換爲root用戶了,但並無改變root登陸環境;用戶默認的登陸環境,能夠在/etc/passwd 中查獲得,包括家目錄,SHELL定義等; [beinan@localhost ~]?$ suPassword:[root@localhost beinan]# pwd/home/beinan su 加參數 - ,表示默認切換到root用戶,而且改變到root用戶的環境; [beinan@localhost ~]?$ pwd/home/beinan[beinan@localhost ~]?$ su -Password:[root@localhost ~]# pwd/root su 參數 - 用戶名 [beinan@localhost ~]?$ su - root 注:這個和su - 是同樣的功能; Password: [root@localhost ~]# pwd /root [beinan@localhost ~]?$ su - linuxsir 注:這是切換到 linuxsir用戶 Password: 注:在這裏輸入密碼; [linuxsir@localhost ~]?$ pwd 注:查看用戶當前所處的位置; /home/linuxsir [linuxsir@localhost ~]?$ id 注:查看用戶的UID和GID信息,主要是看是否切換過來了; uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir) [linuxsir@localhost ~]?$ [beinan@localhost ~]?$ su - -c ls 注:這是su的參數組合,表示切換到root用戶,而且改變到root環境,而後列出root家目錄的文件,而後退出root用戶; Password: 注:在這裏輸入root的密碼; anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot [beinan@localhost ~]?$ pwd 注:查看當前用戶所處的位置; /home/beinan [beinan@localhost ~]?$ id 注:查看當前用戶信息; uid=500(beinan) gid=500(beinan) groups=500(beinan) 四、su的優缺點; su 的確爲管理帶來方便,經過切換到root下,能完成全部系統管理工具,只要把root的密碼交給任何一個普通用戶,他都能切換到root來完成全部的系統管理工做;但經過su切換到root後,也有不安全因素;好比系統有10個用戶,並且都參與管理。若是這10個用戶都涉及到超級權限的運用,作爲管理員若是想讓其它用戶經過su來切換到超級權限的root,必須把root權限密碼都告訴這10個用戶;若是這10個用戶都有root權限,經過root權限能夠作任何事,這在必定程度上就對系統的安全形成了威協;想一想Windows吧,簡直就是惡夢;「沒有不安全的系統,只有不安全的人」,咱們絕對不能保證這 10個用戶都能按正常操做流程來管理系統,其中任何一人對系統操做的重大失誤,均可能致使系統崩潰或數據損失;因此su 工具在多人蔘與的系統管理中,並非最好的選擇,su只適用於一兩我的參與管理的系統,畢竟su並不能讓普通用戶受限的使用;超級用戶root密碼應該掌握在少數用戶手中,這絕對是真理!因此集權而治的存在仍是有必定道理的; 二. sudo 受權許可以使用的su,也是受限制的su 1. sudo 的適用條件 因爲su 對切換到超級權限用戶root後,權限的無限制性,因此su並不能擔任多個管理員所管理的系統。若是用su 來切換到超級用戶來管理系統,也不能明確哪些工做是由哪一個管理員進行的操做。特別是對於服務器的管理有多人蔘與管理時,最好是針對每一個管理員的技術特長和管理範圍,而且有針對性的下放給權限,而且約定其使用哪些工具來完成與其相關的工做,這時咱們就有必要用到 sudo。 經過sudo,咱們能把某些超級權限有針對性的下放,而且不須要普通用戶知道root密碼,因此sudo 相對於權限無限制性的su來講,仍是比較安全的,因此sudo 也能被稱爲受限制的su ;另外sudo 是須要受權許可的,因此也被稱爲受權許可的su; sudo 執行命令的流程是當前用戶切換到root(或其它指定切換到的用戶),而後以root(或其它指定的切換到的用戶)身份執行命令,執行完成後,直接退回到當前用戶;而這些的前提是要經過sudo的配置文件/etc/sudoers來進行受權; 好比咱們想用beinan普通用戶經過more /etc/shadow文件的內容時,可能會出現下面的狀況; [beinan@localhost ~]?$ more /etc/shadow/etc/shadow: 權限不夠 這時咱們能夠用sudo more /etc/shadow 來讀取文件的內容;就就須要在/etc/soduers中給beinan受權 因而咱們就能夠先su 到root用戶下經過visudo 來改/etc/sudoers ;(好比咱們是以beinan用戶登陸系統的) [beinan@localhost ~]?$ su Password: 注:在這裏輸入root密碼 下面運行visodu; [root@localhost beinan]# visudo 注:運行visudo 來改 /etc/sudoers 加入以下一行,退出保存;退出保存,在這裏要會用vi,visudo也是用的vi編輯器;至於vi的用法很少說了;beinan ALL=/bin/more 表示beinan能夠切換到root下執行more 來查看文件; 退回到beinan用戶下,用exit命令; [root@localhost beinan]# exit exit [beinan@localhost ~]?$ 查看beinan的經過sudo能執行哪些命令? [beinan@localhost ~]?$ sudo -l Password: 注:在這裏輸入beinan用戶的密碼 User beinan may run the following commands on this host: 注:在這裏清晰的說明在本臺主機上,beinan用戶能夠以root權限運行more ;在root權限下的more ,能夠查看任何文本文件的內容的; (root) /bin/more 最後,咱們看看是否是beinan用戶有能力看到/etc/shadow文件的內容; [beinan@localhost ~]?$ sudo more /etc/shadow beinan 不但能看到 /etc/shadow文件的內容,還能看到只有root權限下才能看到的其它文件的內容,好比; [beinan@localhost ~]?$ sudo more /etc/gshadow 對於beinan用戶查看和讀取全部系統文件中,我只想把/etc/shadow 的內容可讓他查看;能夠加入下面的一行; beinan ALL=/bin/more /etc/shadow 題外話:有的弟兄會說,我經過su 切換到root用戶就能看到全部想看的內容了,哈哈,對啊。但我們如今不是在講述sudo的用法嗎?若是主機上有多個用戶而且不知道root用戶的密碼,但又想查看某些他們看不到的文件,這時就須要管理員受權了;這就是sudo的好處; 實例五:練習用戶組在/etc/sudoers中寫法; 若是用戶組出如今/etc/sudoers 中,前面要加%號,好比%beinan ,中間不能有空格;%beinan ALL=/usr/sbin/*,/sbin/* 若是咱們在 /etc/sudoers 中加上如上一行,表示beinan用戶組下的全部成員,在全部可能的出現的主機名下,都能切換到root用戶下運行 /usr/sbin和/sbin目錄下的全部命令; 實例六:練習取消某類程序的執行: 取消程序某類程序的執行,要在命令動做前面加上!號; 在本例中也出現了通配符的*的用法; beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把這行規則加入到/etc/sudoers中;但您得有beinan這個用戶組,而且beinan也是這個組中的才行; 本規則表示beinan用戶在全部可能存在的主機名的主機上運行/usr/sbin和/sbin下全部的程序,但fdisk 程序除外; [beinan@localhost ~]?$ sudo -l Password: 注:在這裏輸入beinan用戶的密碼; User beinan may run the following commands on this host:(root) /usr/sbin/*(root) /sbin/*(root) !/sbin/fdisk[beinan@localhost ~]?$ sudo /sbin/fdisk -lSorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost. 注:不能切換到root用戶下運行fdisk 程序; 若是有sudo 的權限而沒有su的權限: sudo su; |