行云无鸣

2008-09-17

对SIGHUP信号的响应

Filed under: 未分类 — 标签:, , , , , — hellyguo @ 23:13

同事又犯了老错误,将脚本当作job在后台执行后,直接关闭了终端。

经我提醒后,记起来了。

他问我原因,解释如下:

1.若是经exit正常退出控制进程,则仅仅对所有在前台的进程发出SIGHUP信号

2.若是未经exit退出控制进程,直接关闭终端,则向控制进程和后台进程发出SIGHUP信号

再转段网上的文字:

异常退出与执行exit

——secureCRT异常退出和执行exit的区别?如果直接关闭secureCRT(此处假设是使用ssh登录终端的),那么对于被登录的系统来说,就是远端程序异常断连。和我们突然断网掉线是一样 的效果。这种情况下,用户并没有信号发送,而是sshd服务检测到对端响应超时,然后向之前建立起的连接以及该连接下(ssh登录后会分配一个bash给 用户)的进程发送结束信号。如果部分进程忽略sshd发送的信号,进程不退出,在分配给用户的bash退出后,该进程将被init进程接管。

另外还有一篇很好的文章,SIGHUP信号与控制终端

2008-04-19

良好的习惯

Filed under: 未分类 — 标签:, , , , — hellyguo @ 11:35

公司有台服务器,需要定时生成文件后向另一台服务器转发。故,写了一个Shell脚本来实现该功能。

执行命令:

#./freshfiel.sh &

命令就在后台自顾自跑了。

移交给同事后,同事说每次他维护机器重启后,执行该命令后,过段时间该进程就down下来了。我就奇怪,我自己启动。结果启动方法都一样,我的进程就好好地跑着。

次数多了,也烦了,想必须找出原因。

昨天正好机子维护。重启后,我就看着他操作,命令是一样的。唯一不同的是,我每次操作完,都是用exit正常签退后才关闭终端的。而我同事是操作完毕不签退直接关闭终端。

原因就在这里。一旦正常签退,后台执行的进程即会转移父进程为init进程:1。而未正常签退的状态下,进程是被kill下来了。

可见,良好的操作习惯之重要!

2008-03-06

批量杀掉进程的脚本

Filed under: 未分类 — 标签:, , — hellyguo @ 13:14

摘自网上,号称是最简的

#!/bin/sh
ps -e|egrep $1 |awk “{print \”kill -9 \” \$1}” | /bin/sh

2008-02-28

为同事编写的文档:www.xxxxx.com启动说明及命令集

Filed under: 未分类 — 标签:, — hellyguo @ 00:24

启动www.xxxxx.com顺序

1.重启服务器

2.启动MySQL

3.启动Oracle数据库

4.启动crontab服务

5.启动smtp

6.启动pop3

7.启动apache

8.启动tomcat

启动192.168.10.9顺序

1.登录192.168.10.9

2.重启服务器

3.启动Oracle数据库

4.启动crontab服务

5.启动ftp服务

6.启动apache

7.启动tomcat

日常监控

1.每日定时接收邮件

方法

查邮件

异常解决

a.查看mail

b.查看cron日志

2.每日定时检查牌价,间隔请自订

方法

查日志

异常解决

a.查看FTP服务器状态

b.查看脚本是否存活

3.每周登录系统,检查各项功能

方法

服务端

以各个系统URL、用户名、密码

客户端

以各个系统客户端、用户名、密码

异常解决

a.确认密码是否正确

b.ping http://www.xxxxx.com,是否能通

c.查看各种日志

命令集

重启服务器

#reboot

启动Oracle数据库

#su - oracle#lsnrctl start

$dbstart

#su - oracle#lsnrctl start

#sqlplus /nolog

SQL> connect / as sysdba

Connected to an idle instance.

SQL> startup

ORACLE instance started.

停止Oracle数据库

#su - oracle#lsnrctl stop

$dbstop

#su - oracle#lsnrctl stop

#sqlplus /nolog

SQL> connect / as sysdba

Connected to an idle instance.

SQL> shutdown immediate

ORACLE instance shut down.

启动Apache

#/usr/local/apache/bin/httpd -k start

停止Apache

#/usr/local/apache/bin/httpd -k stop

启动mysql

#service mysqld start

停止mysql

#service mysqld stop

启动tomcat

#/usr/local/tomcat/bin/startup.sh

停止tomcat

#/usr/local/tomcat/bin/shutdown.sh

启动ftp服务

#service vsftpd start

停止ftp服务

#service vsftpd stop

启动crontab服务

#service crond start

停止crontab服务

#service crond stop

启动smtp

#sendmail -bd -q#/usr/local/sasl2/sbin/saslauthd -a shadow

启动pop3

#/usr/local/sbin/dovecot

连接服务器192.168.10.9

#cd#./login192.168.10.9.sh

查看进程

#ps -ef#ps -ef|grep (特征字符)

查看网络端口

#netstat -an#netstat -an|grep (特定端口)

动态查看服务器总体性能

#top

动态查看日志

#tail -f (日志)

查看日志

#vi (日志)

crontab日志位置

/var/log下

cron

cron.1

cron.2

cron.3

cron.4

crontab回馈

#mail

查找root.localhost发出的主题为”Cron …”的邮件

Apache日志位置

/usr/local/apache2/logs

access_log为访问日志

error_log为错误日志

mod_jk.log为JK与Tomcat通讯日志

Tomcat日志位置

/usr/local/tomcat/logs

catalina.out为所有Tomcat信息输出

2008-01-25

定时取数据并FTP上传到指定服务器

Filed under: 未分类 — 标签:, , — hellyguo @ 17:27

工作需要,写了如下脚本,比较简陋

freshfile.sh

#!/bin/sh

while [ 1=1 ]
do
wget -N http://demo.com/data.txt >>logs/fresh.`date ‘+%Y%m%d’`.log 2>&1
if [ -e data.txt ]
then
./autoftp.sh
fi
sleep 25
done

autoftp.sh

#!/bin/sh

cat ftpcmd|ftp -n >>logs/autoftp.`date ‘+%Y%m%d’`.log 2>&1

ftpcmd

open 192.168.10.9
user ftpuser 123456
ascii
prompt
put data.txt
quit

2008-01-17

转载:介绍UNIX高手的十大习惯

Filed under: 未分类 — 标签:, , — hellyguo @ 13:20

介绍UNIX高手的十大习惯

当您经常使用某个系统时,往往会陷入某种固定的使用模式。有时,您没有养成以尽可能最好的方式做事的习惯。有时,您的不良习惯甚至会导致出现混乱。纠正此 类缺点的最佳方法之一,就是有意识地采用抵制这些坏习惯的好习惯。本文提出了 10 个值得采用的 UNIX 命令行习惯——帮助您克服许多常见使用怪癖,并在该过程中提高命令行工作效率的好习惯。下面列出了这 10 个好习惯,之后对进行了更详细的描述。

在单个命令中创建目录树

清单 1 演示了最常见的 UNIX 坏习惯之一:一次定义一个目录树。

清单 1. 坏习惯 1 的示例:单独定义每个目录树

~ $ mkdir tmp

~ $ cd tmp

~/tmp $ mkdir a

~/tmp $ cd a

~/tmp/a $ mkdir b

~/tmp/a $ cd b

~/tmp/a/b/ $ mkdir c

~/tmp/a/b/ $ cd c

~/tmp/a/b/c $

使用 mkdir 的 -p 选项并在单个命令中创建所有父目录及其子目录要容易得多。但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录。花时间有意识地养成这个好习惯是值得的:

清单 2. 好习惯 1 的示例:使用一个命令来定义目录树

~ $ mkdir -p tmp/a/b/c

您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构。例如:

清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树

~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

过 去,单独定义目录的唯一借口是您的 mkdir 实现不支持此选项,但是在大多数系统上不再是这样了。IBM、AIX®、mkdir、GNU mkdir 和其他遵守单一 UNIX 规范 (Single UNIX Specification) 的系统现在都具有此选项。

对于仍然缺乏该功能的少数系统,您可以使用 mkdirhier 脚本(请参见参考资料),此脚本是执行相同功能的 mkdir 的包装:

~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}
更改路径;不要移动存档

另一个不良的使用模式是将 .tar 存档文件移动到某个目录,因为该目录恰好是您希望在其中提取 .tar 文件的目录。其实您根本不需要这样做。您可以随心所欲地将任何 .tar 存档文件解压缩到任何目录——这就是 -C 选项的用途。在解压缩某个存档文件时,使用 -C 选项来指定要在其中解压缩该文件的目录:

清单 4. 好习惯 2 的示例:使用选项 -C 来解压缩 .tar 存档文件

~ $ tar xvf -C tmp/a/b/c newarc.tar.gz

相对于将存档文件移动到您希望在其中解压缩它的位置,切换到该目录,然后才解压缩它,养成使用 -C 的习惯则更加可取——当存档文件位于其他某个位置时尤其如此。
将命令与控制操作符组合使用

您可能已经知道,在大多数 Shell 中,您可以在单个命令行上通过在命令之间放置一个分号 (;) 来组合命令。该分号是 Shell 控制操作符,虽然它对于在单个命令行上将离散的命令串联起来很有用,但它并不适用于所有情况。例如,假设您使用分号来组合两个命令,其中第二个命令的正确 执行完全依赖于第一个命令的成功完成。如果第一个命令未按您预期的那样退出,第二个命令仍然会运行——结果会导致失败。相反,应该使用更适当的控制操作符 (本文将描述其中的部分操作符)。只要您的 Shell 支持它们,就值得养成使用它们的习惯。

仅当另一个命令返回零退出状态时才运行某个命令

使用 && 控制操作符来组合两个命令,以便仅当 第一个命令返回零退出状态时才运行第二个命令。换句话说,如果第一个命令运行成功,则第二个命令将运行。如果第一个命令失败,则第二个命令根本就不运行。例如:

清单 5. 好习惯 3 的示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

在此例中,存档的内容将提取到 ~/tmp/a/b/c 目录中,除非该目录不存在。如果该目录不存在,则 tar 命令不会运行,因此不会提取任何内容。

仅当另一个命令返回非零退出状态时才运行某个命令

类 似地,|| 控制操作符分隔两个命令,并且仅当第一个命令返回非零退出状态时才运行第二个命令。换句话说,如果第一个命令成功,则第二个命令不会运行。如果第一个命令 失败,则第二个命令才会 运行。在测试某个给定目录是否存在时,通常使用此操作符,如果该目录不存在,则创建它:

清单 6. 好习惯 3 的另一个示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

您还可以组合使用本部分中描述的控制操作符。每个操作符都影响最后的命令运行:

清单 7. 好习惯 3 的组合示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar
谨慎引用变量

始 终要谨慎使用 Shell 扩展和变量名称。一般最好将变量调用包括在双引号中,除非您有不这样做的足够理由。类似地,如果您直接在字母数字文本后面使用变量名称,则还要确保将该变 量名称包括在方括号 ([]) 中,以使其与周围的文本区分开来。否则,Shell 将把尾随文本解释为变量名称的一部分——并且很可能返回一个空值。清单 8 提供了变量的各种引用和非引用及其影响的示例。

清单 8. 好习惯 4 的示例:引用(和非引用)变量

~ $ ls tmp/

a b

~ $ VAR=”tmp/*”

~ $ echo $VAR

tmp/a tmp/b

~ $ echo “$VAR”

tmp/*

~ $ echo $VARa

~ $ echo “$VARa”

~ $ echo “${VAR}a”

tmp/*a

~ $ echo ${VAR}a

tmp/a

~ $
使用转义序列来管理较长的输入

您 或许看到过使用反斜杠 (\) 来将较长的行延续到下一行的代码示例,并且您知道大多数 Shell 都将您通过反斜杠联接的后续行上键入的内容视为单个长行。然而,您可能没有在命令行中像通常那样利用此功能。如果您的终端无法正确处理多行回绕,或者您的 命令行比通常小(例如在提示符下有长路经的时候),反斜杠就特别有用。反斜杠对于了解键入的长输入行的含义也非常有用,如以下示例所示:

清单 9. 好习惯 5 的示例:将反斜杠用于长输入

~ $ cd tmp/a/b/c || \

> mkdir -p tmp/a/b/c && \

> tar xvf -C tmp/a/b/c ~/archive.tar

或者,也可以使用以下配置:

清单 10. 好习惯 5 的替代示例:将反斜杠用于长输入

~ $ cd tmp/a/b/c \

> || \

> mkdir -p tmp/a/b/c \

> && \

> tar xvf -C tmp/a/b/c ~/archive.tar

然而,当您将输入行划分到多行上时,Shell 始终将其视为单个连续的行,因为它总是删除所有反斜杠和额外的空格。

注意:在大多数 Shell 中,当您按向上箭头键时,整个多行输入将重绘到单个长输入行上。

在列表中对命令分组

大多数 Shell 都具有在列表中对命令分组的方法,以便您能将它们的合计输出向下传递到某个管道,或者将其任何部分或全部流重定向到相同的地方。您一般可以通过在某个 Subshell 中运行一个命令列表或通过在当前 Shell 中运行一个命令列表来实现此目的。

在 Subshell 中运行命令列表

使用括号将命令列表包括在单个组中。这样做将在一个新的 Subshell 中运行命令,并允许您重定向或收集整组命令的输出,如以下示例所示:

清单 11. 好习惯 6 的示例:在 Subshell 中运行命令列表

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \

> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \

> | mailx admin -S “Archive contents”

在此示例中,该存档的内容将提取到 tmp/a/b/c/ 目录中,同时将分组命令的输出(包括所提取文件的列表)通过邮件发送到地址 admin。

当您在命令列表中重新定义环境变量,并且您不希望将那些定义应用于当前 Shell 时,使用 Subshell 更可取。
在当前 Shell 中运行命令列表

将命令列表用大括号 ({}) 括起来,以在当前 Shell 中运行。确保在括号与实际命令之间包括空格,否则 Shell 可能无法正确解释括号。此外,还要确保列表中的最后一个命令以分号结尾,如以下示例所示:

清单 12. 好习惯 6 的另一个示例:在当前 Shell 中运行命令列表

~ $ { cp ${VAR}a . && chown -R guest.guest a && \

> tar cvf newarchive.tar a; } | mailx admin -S “New archive”

在 find 之外使用 xargs

使用 xargs 工具作为筛选器,以充分利用从 find 命令挑选的输出。find 运行通常提供与某些条件匹配的文件列表。此列表被传递到 xargs 上,后者然后使用该文件列表作为参数来运行其他某些有用的命令,如以下示例所示:

清单 13. xargs 工具的经典用法示例

~ $ find some-file-criteria some-file-path | \

> xargs some-great-command-that-needs-filename-arguments

然而,不要将 xargs 仅看作是 find 的辅助工具;它是一个未得到充分利用的工具之一,当您养成使用它的习惯时,将会希望进行所有试验,包括以下用法。
传递空格分隔的列表

在最简单的调用形式中,xargs 就像一个筛选器,它接受一个列表(每个成员分别在单独的行上)作为输入。该工具将那些成员放置在单个空格分隔的行上:

清单 14. xargs 工具产生的输出示例

~ $ xargs

a

b

c

Control-D

a b c

~ $

您可以发送通过 xargs 来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:

清单 15. xargs 工具的使用示例

~/tmp $ ls -1 | xargs

December_Report.pdf README a archive.tar mkdirhier.sh

~/tmp $ ls -1 | xargs file

December_Report.pdf: PDF document, version 1.3

README: ASCII text

a: directory

archive.tar: POSIX tar archive

mkdirhier.sh: Bourne shell script text executable

~/tmp $

xargs 命令不只用于传递文件名。您还可以在需要将文本筛选到单个行中的任何时候使用它:

清单 16. 好习惯 7 的示例:使用 xargs 工具来将文本筛选到单个行中

~/tmp $ ls -l | xargs

-rw-r–r– 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r–r– 1 \

root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 \

16:07 a -rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 \

joe joe 3239 Sep 30 12:40 mkdirhier.sh

~/tmp $
谨慎使用 xargs

从技术上讲,使用 xargs 很少遇到麻烦。缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略。为了防止这种情况发生,可以使用 -e 标志,它在不带参数的情况下完全禁用结束字符串。

了解何时 grep 应该执行计数——何时应该绕过

避免通过管道将 grep 发送到 wc -l 来对输出行数计数。grep 的 -c 选项提供了对与特定模式匹配的行的计数,并且一般要比通过管道发送到 wc 更快,如以下示例所示:

清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数

~ $ time grep and tmp/a/longfile.txt | wc -l

2811

real 0m0.097s

user 0m0.006s

sys 0m0.032s

~ $ time grep -c and tmp/a/longfile.txt

2811

real 0m0.013s

user 0m0.006s

sys 0m0.005s

~ $

除了速度因素外,-c 选项还是执行计数的好方法。对于多个文件,带 -c 选项的 grep 返回每个文件的单独计数,每行一个计数,而针对 wc 的管道则提供所有文件的组合总计数。
然 而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误。这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题。但是 在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量 的真实计数。归根结底,若要对实例计数,您还是要使用 wc 来计数。首先,使用 -o 选项(如果您的版本支持它的话)来运行 grep 命令。此选项仅 输出匹配的模式,每行一个模式,而不输出行本身。但是您不能将它与 -c 选项结合使用,因此要使用 wc -l 来对行计数,如以下示例所示:

清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数

~ $ grep -o and tmp/a/longfile.txt | wc -l

3402

~ $

在此例中,调用 wc 要比第二次调用 grep 并插入一个虚拟模式(例如 grep -c)来对行进行匹配和计数稍快一点。

匹配输出中的某些字段,而不只是对行进行匹配

当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep。

下面经过简化的示例演示了如何仅列出 12 月修改过的文件。

清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式

~/tmp $ ls -l /tmp/a/b/c | grep Dec

-rw-r–r– 7 joe joe 12043 Jan 27 20:36 December_Report.pdf

-rw-r–r– 1 root root 238 Dec 03 08:19 README

-rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar

~/tmp $

在 此示例中,grep 对行进行筛选,并输出其修改日期和名称中带 Dec 的所有文件。因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过。这可能不是您希望的结果。为了匹配特定字段中的模式,最好使用 awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:

清单 20. 好习惯 9 的示例:使用 awk 来查找特定字段中的模式

~/tmp $ ls -l | awk ”$6 == “Dec””

-rw-r–r– 3 joe joe 5096 Dec 14 14:26 archive.tar

-rw-r–r– 1 root root 238 Dec 03 08:19 README

~/tmp $

有关如何使用 awk 的更多详细信息,请参见参考资料。
止对 cat 使用管道

grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数。您根本不需要在这种情况下使用 cat,如以下示例所示:

清单 21. 好习惯和坏习惯 10 的示例:使用带和不带 cat 的 grep

~ $ time cat tmp/a/longfile.txt | grep and

2811

real 0m0.015s

user 0m0.003s

sys 0m0.013s

~ $ time grep and tmp/a/longfile.txt

2811

real 0m0.010s

user 0m0.006s

sys 0m0.004s

~ $

此错误存在于许多工具中。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接。

结束语:养成好习惯

最好检查一下您的命令行习惯中的任何不良的使用模式。不良的使用模式会降低您的速度,并且通常会导致意外错误。本文介绍了 10 个新习惯,它们可以帮助您摆脱许多最常见的使用错误。养成这些好习惯是加强您的 UNIX 命令行技能的积极步骤。

2008-01-16

打包多个文件并以附件发送之的shell脚本

Filed under: 未分类 — 标签:, , — hellyguo @ 12:04

用法:mailfile.sh [待打包文件夹路径] [maillist文件]
其中maillist文件必须为单行文件,邮件地址需用空格间隔

#!/bin/sh
cd $1
maillist=`cat $2`

tar zcf data.tar.gz *.txt
if [ -e data.tar.gz ]
then
echo mail to $maillist
uuencode data.tar.gz data.tar.gz | mail -s “Data” $maillist
rm -rf data.tar.gz
else
echo error:$1/data.tar.gz is not exist
fi

linux下mail的使用

Filed under: 未分类 — 标签:, , — hellyguo @ 10:44

公司有台服务器,需要定时将生成的文件以附件模式发送到某些邮箱
为实现该功能,特参考了下述文章:

19.6.1 Linux Mail

作者: 鸟哥 出处:机械工业出版社华章公司 


阅读提示:《鸟哥的Linux私房菜——服务器架设篇》(第二版)第19章的主要介绍的是以Postfix为主的邮件主机架设。本文主要介绍的是Linux Mail。

19.6 客户端的收发信软件

应用Mail Server有两种主要的方式,可以直接登录Linux主机来操作MTA,也可以通过客户端的MUA软件来收发信件,下面分别介绍这两种方式。

19.6.1 Linux Mail

在Unix like的操作系统中都会存在一个可以进行收发信件的指令,即Mail指令。这个指令是由Mail这个软件所提供的,所以需要先安装Mail软件。另外, 由于Mail是Linux系统的功能,所以即使端口25(SMTP)没有启动,它还是可以使用的,只不过该邮件只会被放到队列,而无法寄出去。下面来谈一 谈最简单的Mail用法。

1. 用Mail直接编辑文字邮件与寄信

Mail的用法很简单,即利用“Mail[E-mail address]”的方式来将信件寄出,“ E-mail address”可以是对外的邮件地址,也可以是本机的账号。如果是本机账号的话,直接加账号名称即可。例如:Mail root或Mail somebody@his.host.name。如果是对外寄信的话,信件默认的Mail from就会填写main.cf内的myorigin变量的主机名称。先来试试看,寄给dmtsai@linux.vbird.tsai

[root@linux ~]# Mail dmtsai@linux.vbird.tsaiSubject: Just test          <==这里填写信件标题

This is a test E-mail.     <==下面为信件的内容

bye bye !

.                              <==注意,这一行只有小数点,代表结束输入

Cc:                           <==密码副本

这样即可将信件寄出。另外,早期的Mail Server是可以接收IP寄信的,例如:Mail dmtsai@[192.168.1.254],记得IP要用中括号包起来。不过由于受到垃圾邮件的影响,现在这种方式几乎都无法成功的将信件寄出了。

2. 利用已经处理完的纯文本文件寄信

这里说的不是以附件发送的方式,因为在Mail这个程序里编辑信件是个很痛苦的差事,不能够按上、下、左、右键回到刚刚编辑有错误的地方,很伤脑 筋。此时可以通过标准输入来处理。如果您忘记“< ”代表的意义,请参考《鸟哥的私房菜——基础学习篇》中的Bash shell章节。例如您要将默认目录的“.bashrc”寄给别人,可以这样做:

[root@linux ~]# Mail -s 'My bashrc' dmtsai < ~/.bashrc

3. 开始接收信件

寄信比较简单,那么收信呢?收信还是使用Mail。直接在提示字符后输入Mail时,会主动的捉取用户在/var/spool/Mail下的邮件信 箱(Mailbox),例如dmtsai这个账号在输入Mail后,就会将/var/spool/Mail/dmtsai文件的内容读出来并显示到屏幕 上,结果如下:

[root@linux ~]# MailMail version 8.1 6/6/93.  Type ? for help.

"/var/spool/Mail/dmtsai": 1 message 1 unread

>U  1 root@linux.vbird.tsai  Fri Nov 24 11:34  32/764   "My bashrc"

&  <==这是Mail软件的提示字符,可以输入“?”来查看可用指令

上述代码显示dmtsai有一封信,且会附上该信件的发信者、标题及收信时间等。可以应用的指令如下。

(1)读信(直接按Enter或输入数字按Enter)

当看到“> ”符号时,表示目前Mail所在的邮件字段,您可以直接输入数字按Enter或在“&”后的光标位置输入号码,即可看到该封信件的内容。如果持续按Enter,则会自“>”符号所在的邮件逐次向后读取每封信件内容。

(2)显示标题(直接输入h)

如果要重新显示每封信的标题,则输入h即可。

(3)回复邮件(直接输入R)

如果要回复目前“>”符号所在的邮件,直接输入R即可进入刚刚前面介绍过的Mail文字编辑界面了。可以在编辑信件后回复邮件。

(4)删除邮件(输入d)

输入“d## ”即可删除邮件。例如要删除第2封邮件,可以输入“d 2”如果要删除第10~50封邮件,可以输入“d 10-50”。如果有删除邮件的话,离开Mail box时,要使用q。

(5)储存邮件到文件(输入s+文件名)

如果要将邮件资料存下来,可以输入“s##filename”,例如要将第2封邮件存下来,可以输入“s 1 uuencode”即可将第2封邮件内容另存为uuencode文件。

(6)离开Mail(输入q或x)

要离开Mail可以输入q或者是x,输入x可以在不更改Mail box的情况下离开Mail程序,不管刚刚有没有使用d删除数据;使用q会将删除的数据清除,并且会将所有已读过的信件内容转存到默认目录下的mbox文 件。也就是说,如果您不想更改Mail box,那就使用x或exit离开,如果想要使刚刚移除的操作生效,就要使用q。不过,使用q之后,只有未读的信件才会保留在 /var/spool/Mail/accout里,其他已读的数据都会被存入“~/mbox”中。例如 /home/dmtsai/mbox为储存dmtsai已读过的信件。

(7)请求帮助

关于Mail更详细的用法可以输入help以显示目前Mail的所有功能。

上面是简易的Mail收信功能。不过,如果离开Mail时按下q,信件将转存到“~/mbox”这个邮件信箱,那么该如何读取这个文件内的信件数据呢?可简单的使用以下方式来读取:

[root@linux ~]# Mail -f ~/mbox

4. 以“附件”的方式寄信

前面提到的都是信件的内容,那么能否以“附件”的方式来传递文件呢?当然是可以的,不过需要uuencode指令的帮助,在CentOS中这个指令属于shartuils,请先利用yum来安装它。接下来可以这样使用:

[root@linux ~]# [利用uuencode编码 ] | [利用Mail寄出去][root@linux ~]# uuencode [实际文件] [信件中的文件名]|Mail-s '标题' E-mail范例一:将“~/.bashrc”以附件的方式寄给dmtsai

[root@linux ~]# uuencode ~/.bashrc bashrc | Mail -s 'test encode' dmtsai

这样就能寄出去了,不过,如果收下这封信件呢?需要通过译码器来解码。首先需要将该文件存下来,然后进行如下操作:

[root@linux ~]# MailMail version 8.1 6/6/93.  Type ? for help.

"/var/spool/Mail/dmtsai": 2 messages 2 unread

>U  1 root@linux.vbird.tsai  Fri Nov 24 11:34  32/764   "My bashrc"

U  2 root@linux.vbird.tsai  Fri Nov 24 11:52  24/904   "test encode"

& s 2 test_encode

"test_encode" [New file]

& exit[root@linux ~]# uudecode test_encode -o decode

加密文件          输出文件

虽然Mail指令不是很好用,但至少它可以提供一种在Linux纯文本模式下的简单的收发信件功能。我们最好还是熟悉一下。

参考鸟哥的文章,安装了sharutils,并记录了安装使用方法:

发送邮件说明
1.若要在console模式下发送带附件邮件,需添加软件包sharutils
2.下载sharutils-4.2.1-22.2.FC3.i386.rpm
3.以root登录,以命令:rpm -ivh sharutils-4.2.1-22.2.FC3.i386.rpm安装
4.测试发送:uuencode [本地文件名] [邮件内附件名] | mail -s [主题] [邮送地址,多个可用空格间隔]

2008-01-07

在debian下使用代理telnet/ssh外部服务器

Filed under: 未分类 — 标签:, , , , , — hellyguo @ 17:46

公司上外网都必须经过代理服务器,采用的是CCProxy,只允许访问特定的网站。若不是邮件代理必须采用socks5,1080必须开,就完了。不过,既然开了1080,就等于没有限制。

在Windows下,啥都可以,可以做任何事。但在Linux下,就麻烦了。不是所有软件都支持代理的。我要用telnet,就不得不去借助putty这等软件。当然不是说putty不好,只是putty这样太麻烦了。为了解决这个不顺心的事,在apt中上翻下翻,终于找到一个:tsocks!

配置/etc/tsocks.conf,指定server,type,port后,就可以用:tsocks  telnet xxx.xxx.xxx.xxx访问外网。甚是方便。

但这样还存在中文乱码,又在网上找到一个解决telnet乱码的法子:luit -encoding gbk tsocks telnet xxx.xxx.xxx.xxx。一切和谐了!

简单,明了!这就是linux!

2007-10-17

翻译UNIX脚本至WINDOWS批处理文件

Filed under: 未分类 — 标签:, , , — hellyguo @ 20:10

因为客户环境变化,不得不将UNIX脚本翻译至WINDOWS批处理文件,麻烦。

其他倒都没啥,都还熟悉,就是要通过脚本来获得昨日日期这个,在批处理中实现太麻烦了。用了个变通的法子,采用WSH来实现,使用JS。

var d = new Date();
d.setTime(d.getTime()-24*3600*1000);
var lastdate = d.getYear()+”+parseInt((d.getMonth()+1)/10)+”+(d.getMonth()+1)%10+”+d.getDate();

关键代码就是这个,呵呵

%d 博主赞过: