shell 常見面試題及答案(3)
本文接 《shell 常見面試題及答案(2)》
四、
1.如何取得檔案/etiantian的許可權對應的數字,如-rw-r--r-- 為644,取得644這樣的數字。
解答:
Loong:/home/yee/shell# stat -c %a calculate_birthday.sh
777
知識點:
stat
STAT(1) User Commands STAT(1)
NAME
stat - display file or file system status 顯示檔案或檔案系統狀態
SYNOPSIS
stat [OPTION] FILE...
DESCRIPTION
Display file or file system status.
-L, --dereference
follow links
-f, --file-system
display file system status instead of file status 顯示檔案系統狀態
-c --format=FORMAT
use the specified FORMAT instead of the default; output a newline after each
use of FORMAT
--printf=FORMAT
like --format, but interpret backslash escapes, and do not output a mandatory
trailing newline. If you want a newline, include \n in FORMAT.
-t, --terse
print the information in terse form 簡潔形式輸出
--help display this help and exit
--version
output version information and exit
The valid format sequences for files (without --file-system):
%a Access rights in octal 用8進位制的形式表示許可權
Loong:/home/yee/shell# stat -c %a calculate_birthday.sh
777
%A Access rights in human readable form 可讀型表示法
Loong:/home/yee/shell# stat -c %A calculate_birthday.sh
-rwxrwxrwx
%b Number of blocks allocated (see %B)
%B The size in bytes of each block reported by %b
%C SELinux security context string
%d Device number in decimal
%D Device number in hex
%f Raw mode in hex
%F File type
%g Group ID of owner
%G Group name of owner
%h Number of hard links
%i Inode number
%n File name
%N Quoted file name with dereference if symbolic link
%o I/O block size
%s Total size, in bytes
%t Major device type in hex
%T Minor device type in hex
%u User ID of owner
%U User name of owner
%x Time of last access
%X Time of last access as seconds since Epoch
%y Time of last modification
%z Time of last change
%Z Time of last change as seconds since Epoch
Valid format sequences for file systems:
%a Free blocks available to non-superuser
%b Total data blocks in file system
%c Total file nodes in file system
%d Free file nodes in file system
%f Free blocks in file system
%C SELinux security context string
%i File System ID in hex
%l Maximum length of filenames
%n File name
%s Block size (for faster transfers)
%S Fundamental block size (for block counts)
%t Type in hex
%T Type in human readable form
NOTE: your shell may have its own version of stat, which usually supersedes the ver-
sion described here. Please refer to your shell's documentation for details about
the options it supports.
應用舉例:
Loong:/home/yee/shell# stat practise1.sh
File: “practise1.sh”
Size: 144 Blocks: 8 IO Block: 4096 普通檔案
Device: 806h/2054d Inode: 3776576 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-11-01 15:23:00.000000000 +0800
Modify: 2012-11-01 15:20:55.000000000 +0800
Change: 2012-11-01 15:20:55.000000000 +0800
可以詳細列出檔案的大小,塊及節點,建立修改時間等
Loong:/home/yee/shell# stat test
File: “test”
Size: 4096 Blocks: 8 IO Block: 4096 目錄
Device: 806h/2054d Inode: 3776522 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-11-01 15:45:46.000000000 +0800
Modify: 2012-11-01 15:23:00.000000000 +0800
Change: 2012-11-01 15:23:00.000000000 +0800
2.linux下通過mkdir命令建立一個新目錄/mianwww/ett,它的硬連結數是多少,為什麼?
解答:
硬連結的定義
Linux 檔案系統最重要的特點之一是它的檔案連結。連結是對檔案的引用,這樣您可以讓檔案在檔案系統中多處被看到。不過,在 Linux 中,連結可以如同原始檔案一樣來對待。連結可以與普通的檔案一樣被執行、編輯和訪問。對系統中的其他應用程式而言,連結就是它所對應的原始檔案。當您通過連結對檔案進行編輯時,您編輯的實際上是原始檔案。連結不是副本。有兩種型別的連結:硬連結和符號連結(軟連結)。硬連結只能引用同一檔案系統中的檔案。它引用的是檔案在檔案系統中的物理索引(也稱為 inode)。當您移動或刪除原始檔案時,硬連結不會被破壞,因為它所引用的是檔案的物理資料而不是檔案在檔案結構中的位置。硬連結的檔案不需要使用者有訪問原始檔案的許可權,也不會顯示原始檔案的位置,這樣有助於檔案的安全。如果您刪除的檔案有相應的硬連結,那麼這個檔案依然會保留,直到所有對它的引用都被刪除。
Loong:/home/yee/shell/test1# ls -ial
總計 8
3776564 drwxr-xr-x 2 root root 4096 11-02 14:08 .
3776513 drwxr-xr-x 6 root root 4096 11-29 10:29 ..
每個檔案和目錄都是有兩部分構成,inode和data block
硬連結使用一個inode ,可以用ls -i 檢視 i(inode)請注意檔案屬性後面數字代表被連結的次數
這兩個檔名字只是不同的入口 ,進入相同的內容。所以硬連結不能連結目錄 。
軟連結是另外一個檔案 ,使用不同的inode
儲存檔案的時候例如dir1裡存著兩個硬連線檔案file1和file2,file1和file2的inode是相同的,dir1自身有一個innode,這個inode指向的data block裡存著file1和file2兩個檔案的指向,這兩個指向是相同的,都指向一個innode
3.請執行命令取出linux中eth0的IP地址(請用cut,有能力者也可分別用awk,sed命令答)。
解答:
[email protected]:~$ ifconfig |head -n 2|tail -1|cut -c 21-32
172.16.3.62
[email protected]:~$
[email protected]:~$ ifconfig |awk "/addr:/"|head -n 1|awk 'BEGIN {FS=" "}{ print $2}'
addr:172.16.3.62
4.請給出預設情況eth0網絡卡配置檔案的路徑及客戶端DNS的路徑。
解答:
客戶端DNS的路徑:
/etc/resolv.conf
eth0網絡卡配置檔案的路徑
/etc/sysconfig/network-scripts/ifcfg-eth0
1.配置檔案
/etc/hosts(本地主機ip地址對映,可以有多個別名)。
/etc/services(埠號與標準服務之間的對應關係)。
/etc/sysconfig/network(設定主機名,閘道器,域名)。
HOSTANME=zjw.com(主機名)(需要重啟計算機才有效)
GATEWAY=192.168.1.1(閘道器)
/etc/rc.d/init.d/network restart(指令碼服務啟動)
service network restart(同上,是命令執行)
2.和DNS相關
/etc/host.conf
/etc/nsswitch.conf
/etc/resolv.conf(配置dns)
3.網絡卡配置檔案
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0(哪張網絡卡)
ONBOOT=yes
BOOTPROTO=static(靜態ip狀態設定)
BOOTPROTO=dhcp(dhcp獲取)
IPADDR=192.168.1.8(靜態ip地址)
NETMASK=255.255.255.0
GATEWAY=192.168.1.1(閘道器)(如果在此設定閘道器,則上面的無效)
MACADDR=00:0C:29:96:38:F8(修改mac地址)(永久有效)
/etc/rc.d/init.d/network restart(指令碼啟動)
service network restart(命令啟動)
4.IP配置方法及自動獲取ip
ifconfig eth0 192.168.0.10 將採用預設子網掩碼
ifconfig eth0 192.168.0.10 netmask 255.255.255.252 (手動定義子網掩碼)
ifconfig eth0 up(啟用網絡卡)
/etc/sysconfig/network-scripts/ifup eth0(指令碼啟用網絡卡)或者
ifup eth0(指向/sbin/ifup的符號連結)。注:修改mac地址,用此好像無效,切記。
ifconfig eth0 down(關閉網絡卡)
/etc/sysconfig/netowrk-scripts/ifdown eth0(指令碼關閉網絡卡)或者
ifdown eth0(指向/sbin/ifdown的符號連結)
netconfig
是文字視窗的形式設定IP的命令,修改好之後用
service network restart (讓配置引數生效)
ifconfig eth0 -dynamic(手動設定獲取dhcp ip地址)
5.修改MAC地址
ifconfig eth0 down
ifconfig eth0 hw ether 00:00:0c:12:34:56
/etc/rd.d/init.d/network(上面的修改可儲存在此指令碼中)
ifconfig eth0 up
#上面這種方法是在核心中修改,下次開機將還原
要永久有效在網絡卡配置檔案中加入以下這一條:
MACADDR=00:00:0c:12:34:56
/etc/sysconfig/network-scripts/ifcfg-eth0
6.常用測試命令
ping -c 4 172.16.1.1
route (對核心的ip路由表進行操作,主要對己配置的介面的主機或網路設定靜態路由,如通過ifconfig程式配)
route add -net 192.168.1.0 netmask 255.255.255.0 eth0 (新增一條到192.168.1.0網路的路由條目)
route del -net 192.168.1.0 netmask 255.255.255.0 (刪除路由條目)
route -C 檢視緩衝表
route -n 檢視本地路由表
traceroute 路由跟蹤
注:netconfig、ifconfig、route三者結合使用,不用重啟系統及服務。
5.查詢當前目錄下所有檔案,並把檔案中的www.mianwww.com字串替換成rainman
解答思路:
1 #!/bin/bash
2
3
4 for line in `ls `
5 do
6 #對檔案內的特定字元進行替換
7
8 done
單個檔案處理字元替換:sed
[email protected]:~/shell$ cat du.txt
957 ./test_practise.sh
503 ./full-name-output.sh
1386 ./passwd
181 ./self_add2.sh
14 ./deal_passwd.sh
Loong:/home/yee/shell# sed -e 's/passwd/com/' du.txt 將passwd替換成com
957 ./test_practise.sh
503 ./full-name-output.sh
1386 ./com
181 ./self_add2.sh
14 ./deal_com.sh
Loong:/home/yee/shell#
6.問題:如何賦予mianwww檔案 -rw-r--r-x許可權屬性
解答:
該許可權分成3部分:只需通過root或所有者利用chmod更改即可;
rw- 讀寫 ----4+2 = 6
-r- 讀 -----4
r-x 讀執行 ------4+1 = 5
chmod 645 file 即可更改;
Loong:/home/yee/shell# ls -l du.txt
-rw-r--r-- 1 root root 102 11-29 15:22 du.txt
Loong:/home/yee/shell# chmod 645 du.txt
Loong:/home/yee/shell# ls -l du.txt
-rw-r--r-x 1 root root 102 11-29 15:22 du.txt
Loong:/home/yee/shell#
7.執行下面命令時發現提示需要輸入密碼,請問提示輸入的密碼是哪個使用者的密碼。
[[email protected] ~]$ sudo su - mianwww
解答:
su - : 切換到 root sudo su - : 以 root 身份執行 su - 命令 不管你以什麼身份執行 su - 命令,結果都是一樣的,所以 sudo su - 沒意義,直接 su - 即可 密碼應該是root 使用者的8.問題:請問在一個命令上加什麼引數可以實現下面命令的內容在同一行輸出。
echo "mianwww";echo "mianwww"
解答:
Loong:/home/yee/shell# echo -n "mianwww";echo "mianwww"
mianwwwmianwww
加引數 -n 不換行Loong:/home/yee/shell# echo -e '\tmianwww'
mianwww
另外,加引數 -e 使用轉義字元9.問題:請給出如下格式的date命令 例:11-02-26
解答:
Loong:/home/yee/shell# date +%y-%m-%d
12-11-29
10.實現按周輸出 比如:週六 輸出為 6
解答:
Loong:/home/yee/shell# date +%A
星期四
Loong:/home/yee/shell# date +%A%u
星期四4
Loong:/home/yee/shell# date +%u
4
11.問題:擴充套件問題:列印三天前時間,日期格式如:2011-02-26
解答:
Loong:/home/yee/shell# date +%F 可惜是3天前的,不能這樣做
2012-11-29
3天前的時間比較複雜,有幾種特殊情況,前三天是另一年,另一個月,這樣不能單獨計算,不曉得有沒有在date +%s上減去3天的24*60*3 時間再換算的顯示方法,若有則比較簡單,你有啥方法呢?12.已知/mianwww/test.txt檔案內容為:
mianwww
xizi
xiaochao
請問如何把檔案中的空行過濾掉(要求命令列實現)。
解答:grep -v "^\s*$" /mianwww/test.txt
Loong:/home/yee/shell# cat du.txt
test_practise.sh
full-name-output.sh
1386 ./passwd
/self_add2.sh
14 ./deal_passwd.sh
Loong:/home/yee/shell# grep -v "^\s*$" du.txt
test_practise.sh
full-name-output.sh
1386 ./passwd
/self_add2.sh
14 ./deal_passwd.sh
Loong:/home/yee/shell#
13-14.請描述下列路徑的內容是做什麼的?
/var/log/message
所有的開機系統發生的錯誤都會在此記錄;
/var/log/secure
1)/var/log/secure:記錄登入系統存取資料的檔案;
例如pop3,ssh,telnet,ftp等都會記錄在此
/var/spool/clientmqueue
logwatch生成的日誌mail檔案
/proc/interrupts
列出了當前系統定義的所有硬中斷
/etc/fstab
/etc/fstab存放的是系統中的檔案系統資訊;它是決定一個硬碟(分割槽)被怎樣使用或者說整合到整個系統中的唯一檔案。fstab可以自動掛載各種檔案系統格式的硬碟、分割槽、可移動裝置和遠端裝置等
/proc/interrupts檔案中列出當前系統使用的中斷的情況,所以某個中斷處理沒有安裝,是不會顯示的。哪怕之前安裝過,被解除安裝了。
從左到右分別是,
irq的序號, 在各自cpu上發生中斷的次數,可程式設計中斷控制器,裝置名稱(request_irq的dev_name欄位)
$cat /proc/interruptsCPU0 CPU1
0: 2822434225 0 IO-APIC-edge timer
1: 12 45 IO-APIC-edge i8042
補充:
1)/var/log/secure:記錄登入系統存取資料的檔案;
例如pop3,ssh,telnet,ftp等都會記錄在此.
2)/ar/log/wtmp:記錄登入這的資訊記錄,被編碼過,所以必須以last解析;
3)/var/log/message:jihu所有的開機系統發生的錯誤都會在此記錄;
4)/var/log.boot.log:記錄一些開機或者關機啟動的一些服務顯示的啟動或者關閉的資訊;
5)/var/log/maillog:記錄郵件的存取和往來;
6)/var/log/cron:用來記錄crontab這個服務的內容;
7)/var/log/httpd,/var/log/mysqld.log等等檔案,記錄幾個不同的網路服務的記錄檔案;
8)/var/log/acpid , ACPI - Advanced Configuration and Power Interface,表示高階配置和電源管理介面。
後面的 d 表示 deamon 。 acpid 也就是 the ACPI event daemon 。 也就是 acpi 的訊息程序。用來控制、獲取、管理 acpi 的狀態的服務程式。
9)/var/run/utmp 記錄著現在登入的使用者;
10)/var/log/lastlog 記錄每個使用者最後的登入資訊;
11)/var/log/btmp 記錄錯誤的登入嘗試;
12)/var/log/dmesg核心日誌;
13)/var/log/cpus CPU的處理資訊;
14)/var/log/syslog 事件記錄監控程式日誌;
15)/var/log/auth.log 使用者認證日誌;
16)/var/log/daemon.log 系統程序日誌;
17)/var/log/mail.err 郵件錯誤資訊;
18)/var/log/mail.info 郵件資訊;
19)/var/log/mail.warn 郵件警告資訊;
20)/var/log/daemon.log 系統監控程式產生的資訊;
21)/var/log/kern 核心產生的資訊;
22)/var/log/lpr 行印表機假離線系統產生的資訊;
五、
1. 如何檢視apache程序數
分兩個情況
perfork模式:
ps -ef|grep http|grep -v grep|wc -l 通過-v 排除grep 程序
worker模式
pstree -a|grep httpd|wc -l
前者程序模式 後者執行緒模式 故檢視方法也有區別
說明:如果學生答題時,能一分為二的解答 會比一個答案好很多的
2. 處理以下檔案內容,將域名取出並進行計數排序,如處理
oldboy.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
分析:此類問題是運維工作中最常見的問題。可以演變成分析日誌,檢視TCP各個狀態連線數,檢視單IP連線數排名等等
第一類 過濾域名方法
方法很多 這裡給出六種 為例。還可以寫出幾種 留給大家了。哈哈
法一:
[[email protected] ~]# cut -d “/” -f 3 oldboy.log |sort|uniq -c cut 擷取指定內容
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
法二:
[[email protected] ~]# awk -F “/” ‘{print $3}’ oldboy.log |sort|uniq -c 擷取指定內容
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
法三:
[[email protected] ~]# sed ‘s/^ htt.*\/\///g’ oldboy.log |sed ‘s/\/.*html$//g’|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
法四:
[[email protected] ~]# cat oldboy.log |tr “\/” “\n”|grep etiantian|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
第二類:
法五:
[[email protected] ~]# cut -d “/” -f 3 test.log|awk ‘{++S[$1]} END {for(key in S) print key,S[key]}’|sort -k 2
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
法六:
一個利用AWK陣列綜合解決方法
[[email protected] ~]# awk -F “/” ‘{++S[$3]} END {for(key in S) print key,S[key]}’ oldboy.log|sort -k2
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
以上答案 不同組合 已可以達到10多種答案,前面兩種還行,後面太複雜,多少有點問題。
六、問題1:請通過awk命令取出伺服器eth0網絡卡配置的ip地址(注*:此題可上機操作。目的:考察awk應用)。
解答:
[[email protected] ~]# ifconfig eth0|grep “inet addr”|awk ‘{print $2}’|awk -F”:” ‘{print $2}’
10.0.0.148
問題2:通過sed命令將/tmp/old-boy.txt中的/usr/log替換為 /home/oldboy(來自《360公司》面試 from jeacen)
解答:
[[email protected] ~]# cat /tmp/old-boy.txt
/usr/log
oldboy
[[email protected] ~]# sed -e “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt “#”在這裡是分隔符,代替了預設的“/”分隔符
/home/oldboy
oldboy
[[email protected] ~]# sed -i “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt
[[email protected] ~]# cat /tmp/old-boy.txt
/home/oldboy
oldboy
方法一:sed -i ‘s#\/usr\/log#\/home\/oldboy#’ /tmp/old-boy.txt 等同sed -i ‘s#/usr/log#/home/oldboy#’ /tmp/old-boy.txt
sed ‘s#10#100#g’ example—–不論什麼字元,緊跟著s命令的都被認為是新的分隔符,所以,“#”在這裡是分隔符,代替了預設的“/”分隔符。表示把所有10替換成100
方法二:sed -i ‘s/\/home\/oldboy/\/usr\/log/’ /tmp/old-boy.txt
關鍵在轉義符使用 \
方法三:sed -i “s#/usr/log#/home/oldboy#” /tmp/old-boy.txt ==>雙引號也可以。
提示:”/”為特殊字元,需要轉義,在斜線前面加反斜線來轉義。本例中方法一不轉義也可以完成。
問題3:通過find搜尋/var/log下3天以前的日誌並刪除
解答:
find /var/log/*.log -mtime +3 -exec rm {} \;
find /var/log/*.log -mtime +3 -type f -exec rm -f {} \;
find /var/log/*.log -type f -mtime +3 |xargs rm -f
提示:
1.有關find的各種詳細案例講解總結請參看〈老男孩筆記系列-find命令實戰案例講解指南〉
2.rm 命令請慎用,本人近10年運維親身或聽別人說過數十次使用該命令造成的無法彌補的後果。
問題4:192.168.0.0網段通過192.168.0.1閘道器的連入172.16.0.0 ip段,如何新增路由(來自《360》面試 from jeacen)
解答:/sbin/route add -net 172.16.0.0 netmask 255.255.255.0 gw 192.168.0.1
提示:有關route及ip命令的使用,課上將詳細講解。很重要的命令,必須要掌握。
問題5:shell特殊變數中 $?,$#分別表示什麼意思?
解答:
$? 獲取執行的上一個指令的返回值(0 為成功, 非零為失敗)
$# 獲取當前 shell 命令列中引數的總個數
問題6:正則表示式中表示以…開頭,和以…結尾的符號分別為?
解答:
^ 以…開頭
$ 以…結尾,這個用的少
問題7:搜尋/oldboy.txt中包含oldboy或linux字串的所有行,請給出命令。
解答:
[[email protected] tmp]# cat /oldboy.txt|grep -E “oldboy|linux”
#==>很多同學喜歡這個低效的方法,希望看到本文後能改。
oldboy
linux
[[email protected] tmp]# grep -E “oldboy|linux” /oldboy.txt
oldboy
linux
[[email protected] tmp]# egrep “oldboy|linux” /oldboy.txt
oldboy
linux
答案:grep -E “oldboy|linux” /oldboy.txt 或 egrep “oldboy|linux” /oldboy.txt
問題8:處理以下日誌檔案內容,將域名取出來並根據域名進行計數排序處理:(百度和sohu面試題)
/oldboy.log
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
處理結果形式:
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
前面的數字分別表示,後面的域名在檔案中出現的次數。
實際上本題就是統計日誌中訪問不同域名的次數,並按次數排
說明:本題的思路非常有用,如生產環境中,可以通過netstat檢視已建立連線的頻繁訪問服務的ip排序,
也可以檢視web日誌,看看一天或一個小時甚至幾分鐘內,列出IP訪問量的排序等等。
解答:
[[email protected] tmp]# cut -d “/” -f3 /oldboy.log |sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[[email protected] tmp]# awk -F “/” ‘{print $3}’ /oldboy.log|sort|uniq -c
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
問題9. 在Shell環境下,如何檢視遠端Linux系統運行了多少時間?( sohu面試題)
[[email protected] tmp]# uptime
00:27:01 up 4:54, 1 user, load average: 0.00, 0.01, 0.00 該答案應該還要新增ssh,前面已有解
shell指令碼程式設計實戰模擬考試題(上機)
1.執行yum install httpd -y 安裝httpd。
2.檢查安裝情況
[[email protected] tmp]# rpm -qa httpd
httpd-2.2.3-45.el5.centos.1
3.啟動httpd,並檢查
[[email protected] tmp]# /etc/init.d/httpd start
啟動 httpd:[確定]
[[email protected] tmp]# netstat -lnt|grep 80 #==>檢查埠
tcp 0 0 :::80 :::* LISTEN
[[email protected] tmp]# ps -ef|grep httpd#==>檢查程序
root 4041 1 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4043 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4044 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4045 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4046 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4047 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4048 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4049 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
apache 4050 4041 0 14:24 ? 00:00:00 /usr/sbin/httpd
root 4061 3793 0 14:25 pts/0 00:00:00 grep httpd