关于 八月, 2011 的文章

优化history历史命令记录并加上执行时间

加入新公司以后,我发现很多的开发与测试服务器的权限放得很开,很多人都有账号,而且不少人还有root权限,因此常常出现一些误操作问题,每次在出现问题的时候他们都会来找我查一下哪个用户在什么时间执行了什么操作导致的问题。
由于Linux默认的history记录仅保存了命令的内容,没有具体的时间,我只能通过查出用户的登录与退出的时间,来给他们一个时间范围。

因此,我们非常有必要对history历史命令的记录功能进行优化,我推荐的参数如下:

编辑/etc/bashrc,添加以下配置信息:

# 文件中的历史命令条数
export HISTFILESIZE=10000000
# 内存中的历史命令条数
export HISTSIZE=10000
# 实时记录历史命令,默认只有在用户退出之后才会统一记录,容易造成多个用户间的相互覆盖。
export PROMPT_COMMAND="history -a"
# 记录每条历史命令的执行时间
export HISTTIMEFORMAT="%Y-%m-%d_%H:%M:%S "
# 忽略部分常用的历史命令
export HISTIGNORE="history*:pwd:ls:ll"
# 忽略重复的历史命令
export HISTCONTROL="ignoredups"

使更改立即生效:
# source /etc/bashrc

查看历史命令记录:
# history

即可看到如下图所示的带有执行时间的新格式:

另外,加上一些其它的别名,也能起到一些优化作用。

# User specific aliases and functions
alias rm='rm -i' #删除时确认
alias cp='cp -i' #复制覆盖时确认
alias mv='mv -i' #移动覆盖时确认
alias grep='grep --color=auto' #为grep增加颜色
alias ll='ls -l' #详细信息列表
alias la='ls -A' #带有隐藏文件输出的详细信息列表

如果想暂时取消别名的附加参数功能,比如不经过确认直接删除文件,可以用“\”将命令转义一次再执行,如下所示:

[root@localhost ~]# echo "I am new" > newfile.txt
[root@localhost ~]# echo "I am old" > oldfile.txt
[root@localhost ~]# cp newfile.txt oldfile.txt 
cp: overwrite `oldfile.txt'? no
[root@localhost ~]# cat oldfile.txt 
I am old
[root@localhost ~]# \cp newfile.txt oldfile.txt 
[root@localhost ~]# cat oldfile.txt 
I am new

6 Comments

在Jboss中添加Godaddy的SSL域名证书的方法

公司购买的Godaddy的SSL域名证书快要到期了,最初用于Jboss下的SSL域名证书是Godaddy直接给我们的,命名为tomcat.jks,只需要在server.xml中指定keystoreFile(证书存放的路径) 与 keystorePass(证书上的密钥)的值就可以使用了。
但这一次通过Godaddy的域名管理后台下载好了 域名的证书(your-domain-name.crt) 和 域名的证书私钥(your-key-name.key) 之后,按照Godaddy的官方文档所创建出的新证书始终不能成功应用,具体表现为Jboss在启动的时候根本无法监听443端口,而且80端口也会被影响,无法正常访问。

后来,通过不断的尝试,终于把问题给解决了,主要有两种方法:

方法一:
按照Godaddy的官方文档中第一个选项来生成tomcat.jks(这个文件的名称可以修改),并在Jboss的server.xml中指定其key的类型为keystoreType="PKCS12";

# openssl pkcs12 -export -chain -CAfile gd_bundle.crt -in your-domain-name.crt -inkey your-key-name.key -out tomcat.jks -name tomcat
若域名证书的私钥文件上带有密码的话,会提示要求输入密码;
接着还会要求输入两次新创建的tomcat.jks证书的密钥。

其中,gd_bundle.crt需要从Godaddy的Repository下载,your-domain-name.crt 和 your-key-name.key 都需要从Godaddy的域名管理后台下载,tomcat.jks可以修改为你想要生成的证书的名字,最后的tomcat是证书的别名,同样可以修改。

修改server.xml中的配置如下:

      <Connector protocol="HTTP/1.1" SSLEnabled="true" 
           port="443" address="${jboss.bind.address}"
           scheme="https" secure="true" clientAuth="false" 
           keystoreFile="${jboss.server.home.dir}/conf/tomcat.jks"
           keystorePass="your-key-password" keystoreType="PKCS12" sslProtocol = "TLS" />

其中,keystoreFile的值需指定为实际的key所存放的位置,建议存放到jboss的conf目录;keystorePass的值为上面创建tomcat.jks时设置的密钥的值。

最后,用新的tomcat.jks替换掉旧的,然后重启一下Jboss,通过https访问便可以看到新的域名证书了。

方法二:
因为公司有很多的服务器都需要用到这个新的tomcat.jks证书文件,而方法一还需要修改Jboss的server.xml配置文件,感觉比较麻烦。
并且因为之前的证书文件在未经修改server.xml时都可以成功应用,新的应该也有办法,最后我找到了一篇文章,实现了不修改server.xml就可以成功应用新证书。

# openssl pkcs12 -export -chain -CAfile gd_bundle.crt -in your-domain-name.crt -inkey your-key-name.key -out tomcat.jks.pkcs12 -name tomcat
该步骤与方法一相同,仅仅是将tomcat.jks名称改为了tomcat.jks.pkcs12,以便下面的步骤生成新的tomcat.jks。

# keytool -importkeystore -deststorepass 'your-key-password' -destkeypass 'your-key-password' -destkeystore tomcat.jks -srckeystore tomcat.jks.pkcs12 -srcstoretype PKCS12 -srcstorepass 'your-key-password' -alias tomcat

未经修改的server.xml中的配置如下:

      <Connector protocol="HTTP/1.1" SSLEnabled="true" 
           port="443" address="${jboss.bind.address}"
           scheme="https" secure="true" clientAuth="false" 
           keystoreFile="${jboss.server.home.dir}/conf/tomcat.jks"
           keystorePass="your-key-password" sslProtocol = "TLS" />

最后,同样是用新的tomcat.jks替换掉旧的,然后重启一下Jboss,通过https访问便可以看到新的域名证书了。

, , ,

No Comments

Linux运行与控制后台进程的方法:nohup, setsid, &, disown, screen

我们经常会碰到这样的问题,用ssh登录了远程的Linux服务器,运行了一些耗时较长的任务,结果却由于网络等的不稳定导致任务中途失败。
这是由于在用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。
解决办法有两种:让进程忽略HUP信号,或让进程运行在新的会话里从而成为不属于此终端的子进程。

下面是对Linux下运行与控制后台进程的各种方法的介绍:
1.nohup
顾名思义,nohup的用途就是让提交的命令忽略所有的hangup信号。
使用方法:nohup COMMAND [ARG]...

2.setsid
在一个新的会话中运行命令,从而可以避开当前终端发出的HUP信号。
使用方法:setsid COMMAND [ARG]...

3.&
可以结合()产生一个新的子shell并在这个子shell中将任务放置到后台运行,从而不受当前shell终端的HUP信号影响。
使用方法:(COMMAND [ARG]... &)

而我通常的使用方式为:
nohup ./filename.sh > filename.log 2>&1 &
nohup ./filename.sh &> filename.log &
三点理由:
1)nohup保障进程不会被hangup信号异常中断;
2)将任务放置到后台运行,不占用当前的终端;
3)将错误输出也打印到log中,默认>只有标准输出,错误输出没有。

阅读全文 »

, , ,

3 Comments

在Windows下利用PowerShell脚本定时删除过期文件

公司有一台 Windows server 2008 R2 服务器的空余磁盘空间比较多,打算利用起来作为其它服务器的远程备份。在配置好了IIS的FTP服务,并在Linux下完成了FTP备份脚本并加入到crontab之后,忽然想到自己忽略了一项工作,就是在Windows上定期删除过期的备份文件。
不过Windows上可不像Linux那么方便,一个find口令就能全部搞定,记得以前研究过DOS下用BAT脚本来处理,结果光在时间的判断上都搞了很久,不过还好目前Windows Server 2008 上都默认集成了PowerShell工具,Windows Server 2003 上也可以安装。
最后,我在参考了一些资料后,通过一个简单的PowerShell脚本加Windows计划任务,完成了这项工作。

相关步骤如下:
1.解除系统对PowerShell脚本执行的禁止
由于默认系统中PowerShell脚本没有足够的权限运行,因此我们需要手动修改并赋予其执行权限,步骤如下:
控制面板 - 管理工具 - Windows PowerShell Modules

PS C:\Windows\system32> Get-ExecutionPolicy
Restricted
PS C:\Windows\system32> Set-ExecutionPolicy RemoteSigned

执行策略更改
执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies
帮助主题中所述的安全风险。是否要更改执行策略?
[Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): Y

至此,便解除了系统对PowerShell脚本执行的禁止。

2.编写PowerShell脚本
新建一个文本文件,命名为 del-expired.ps1内容如下:

echo "These expired files have been deleted:"

$a = Get-ChildItem E:\FTPbackup\servername 
#替换这里的 E:\FTPbackup\servername 为你的备份文件实际存放目录

foreach ($x in $a)
{
$y = ((Get-Date) - $x.LastWriteTime).Days
if ($y -gt 6 -and $x.PsISContainer -ne $True) #替换这里的 6 为你需要保留的实际天数
    {
    $x.Delete()
    echo $x
    }
}

因为我们发现Windows的计划任务不能直接调用PowerShell脚本来执行。所以,我们需要再新建一个文本文件,命名为del-expired.bat
内容如下:

powershell E:\FTPbackup\del-expired.ps1 
#替换这里的 E:\FTPbackup\del-expired.ps1  为你的脚本实际存放位置

3.使用Windows计划任务来定期执行脚本
控制面板-管理工具-任务计划程序-创建任务
配置如下:
常规:输入 名称,描述 - 勾选“不管用户是否登录都要运行” -输入密码 - 勾选“使用最高权限运行”
触发器:新建 - 选择“制定计划时” - 选择 执行时间如“7:30:00” - 选择执行周期如“每天 每隔1天发生一次” - 勾选“启用”
操作:新建 - 选择“启动程序” - “浏览”刚刚创建好的del-expired.bat脚本 - 点击“确定”

至此,计划任务就配置完成了,如果想要测试计划任务是否能正常执行,直接手动立即运行一次即可。

9 Comments