2018/12/18

[English] include, including, included的用法区别

一直对include, including, included的用法存在疑惑,今天找到一篇很棒的文章,简练如下,算是做个笔记吧。
include 就是一般动词「包括、包含」的意思,需要搭配主语、宾语。
例句:The meal includes dessert and beverage.

including 是用来带出包含的事物,在主要句子后面先加上逗号之后,由 including 引导包含的事物。
例句:Some people are trapped in the burning building, including two men and five women.

included 也是在主要句子后加上逗号,再作补充说明,不过它放置的位置跟 including 相反,会先讲出所包含的事物,再加上 included 于后方位置。
例句:Some people are trapped in the burning building, two men and five women included.

2018/12/12

Linux挂载硬盘的小插曲

本人Linux小白一枚,前两天给一台已有3块硬盘的电脑加硬盘,螺丝拧紧后把SATA线一头连硬盘,另一头随便找了个空SATA位插入,便开机。

系统启动后显示如下画面。


网上Google了很多资料,也没解决,后来想是不是硬盘顺序的关系,遂逐个调换SATA线顺序,终于搞定。(其实拔掉新硬盘,用fdisk -l查看硬盘顺序,就是/dev/sdx这个顺序,再去调换硬盘会快一点。)

所以,方法你Get到了没?😁

2018/12/06

在不重装的情况下清空Windchill系统中的CAD资料(Wiping the Windchill data without reinstalling)

公司去年上了PTC公司的PLM/PDM系统:Windchill,但因为研发人员对产品的规范有分歧,多次开会后,最后决定清空所有已上传的资料,包括产品库和存储库里的所有资料。

这说起来容易,做起来难啊,可苦了这帮IT兄弟了,谁叫咱是“挨踢人猿”呢……

Windchill系统里通过Creo上传的资料,一旦被其他产品引用,或进行了升级,想要删除是非常困难的,各种关联、约束都来了,大系统的好处就在这里。没办法,技术出身的,前台没法删,只能从数据库后台想办法了。

从Google查了很多资料,但提供这种思路的几乎没有,而且基本上是英文的,都来自PTC社区,最后终于有点线索了。只要清楚了Oracle的表结构,删除资料自然不是难事。废话少说,直接上干货:
清空所有以EPM开头的表,这些表存储了CAD文档及其关联关系;
清空WTPART表,这里存储了所有PART的信息;
清空BASELINEMEMBER表, 这里存储了所有BaseLine的信息。
上述表都是在PDMLINK11这个Users下的。 清空表之前最好做个备份,当然也要停止Apache的httpd服务,避免用户还在操作系统。

后台处理完后,开启httpd服务并登录Windchill,在右上角的“搜索”框旁点击小三角,选择“高级搜索“,关键字录入“*.*”,“类型”和“上下文”都选择“所有”,然后搜索,即可找到所有待删除的文件,全选再从“操作”里找到“删除”就能搞定了。

如果你在删除过程中遇到问题,欢迎留言与我讨论。

2018/11/16

ORA-00257问题解决

今天登录Tiptop ERP测试环境时,出现错误“ ORA-00257: archiver error. Connect internal only, until freed”,通过以下方法手动释放归档空间后已OK,做个记录。

> rman target / 
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';  ---删除7天前的所有归档日志
RMAN> CROSSCHECK ARCHIVELOG ALL;
RMAN> DELETE EXPIRED ARCHIVELOG ALL;
原文:https://blog.csdn.net/wenshuangzhu/article/details/44059809 
关闭归档功能的方法:https://blog.csdn.net/JohnnySun2015/article/details/74196786

定期删除归档脚本:https://blog.csdn.net/liqfyiyi/article/details/7017238 或 http://www.zhoudl.com/linux/1006.htm

2018/10/30

Oracle事务中的DDL语句

最近一直都在跟Tiptop ERP战斗,User发现了一个严重的问题,采购订单自动发送邮件给厂商时,只有15个项次,但我们自己查询时居然是19项,用impdp把当天的数据翻出来看,也没发现问题。

只能去追查程序了,原来是因为sapmt540.4gl中有个函数t540_pmn25(),它的作用是检查请购单项次并将请购单项次的备注(pmo_file)写入采购单的备注(pmo_file),读写pmo_file采用了操作临时表x来完成。其处理方法本身没问题,但该函数又被函数t540_b()调用,而对于临时表x的DDL操作(此处是DROP TABLE)会使TRANSACTION失效,不再锁定pmm_file,从而导致User A还在编辑采购订单的单身,User B就已把该采购订单审核甚至发出了。

解决办法:读写pmo_file的部分,改为FOREACH请购单项次的pmo_file资料,重新对pmo01/pmo02/pmo03赋值后,再INSERT到采购单项次的pmo_file。

终极原因:Oracle的DDL不是事务性的,运行DDL语句将隐式地提交该会话的任何打开的事务。

2018/09/30

用impdp恢复expdp备份的某个表到另一Schema

有人把资料维护错了,后来偷偷改了,又不承认😠,逼得我去把备份的资料恢复出来,给她难堪……

因为是expdp备份的,对应的恢复就用impdp啦。

简单介绍下环境:Tiptop ERP的Oracle数据库,在Linux下运行,要从正式Schema(al1)的备份恢复到测试的Schema(ostest),只需恢复ima_file这个表。

直接上指令了:
impdp directory=EXPDP_DIR dumpfile=full_20180929.dmp logfile=imp_ostest_ima_20180930.log schemas=ostest include=table:\"in \'ima_file\'\"
没成功,错误提示:
ORA-31655: no data or metadata objects selected for job
原来是因为没有指明来源的Schema,调整指令为:
impdp directory="EXPDP_DIR" dumpfile=full_20180929.dmp logfile=imp_ostest_ima_20180930.log remap_schema=al1:ostest tables=al1.ima_file table_exists_action=replace
这样就OK了,如果没有加table_exists_action=replace,而目标Schema中已存在这个表,则会出现错误:
ORA-39151: Table "OSTEST"."IMA_FILE" exists. All dependent metadata and data will be skipped due to table_exists_action of skip
参考资料:OracleOnLinux

2018/09/14

定时查找并修改Linux中文件的权限

公司有好几位同事在进行Tiptop ERP的二次开发工作,为了权责清晰,每人使用各自的Linux帐号,但是有些同事不喜欢用VIM在Linux下编辑程序的源文件,需要用sz和rz在Linux和Windows之间传输文件。这样就出现一个问题,通过rz上传到Linux的文件默认权限是644,其他同事就没法修改了,网上找了很多Zmodem的资料,也没相关的解决办法,没解决这个问题之前,就先让系统定时把这些文件的权限改下吧,一行命令加入Crontab即可。
find */4gl/ -perm 644 -type f -exec chmod 775 {} \;
上面的"*/4gl/"的意思是在当前目录的下一级目录下的4gl子目录,你可以改成适合自己的。

参考资料:yttitan

2018/09/12

Tiptop版本控制小脚本

为了方便在Tiptop ERP二次开发时做简单的版本控制,写了个脚本,用来将当前的文件改名为以当天日期为后缀文件,再将这个文件复制产生新版本的文件。

写脚本的功力实在是浅,各位请指教,勿喷。😊(权当做个笔记吧)
#!/bin/sh
newName=$1`date +%Y%m%d`
if [ ! $1 ]; then
  echo " *** Failed, the arg is null. ***"
else
  if [ ! -f $1 ]; then
    echo " *** Failed, the file does not exist. ***"
  else
    if [ ! -f $newName ]; then
      /bin/mv $1 $newName
      /bin/cp $newName $1
      /bin/ls -al $1*
    else
      if [ ! -f $newName-1 ]; then
        /bin/mv $1 $newName-1
        /bin/cp $newName-1 $1
        /bin/ls -al $1*
      else
        echo " *** Failed, new file already exist. ***"
        /bin/ls $1*
      fi
    fi
  fi
fi

2018/09/04

Fixed a problem with EPSON dot matrix printer

Our factory have a EPSON dot matrix printer (Model Number is 630K), the user told me the printer printing "12345x @PJL ENTER LANGUAGE=ACL" about every five seconds.

It seems like installed wrong drivers, but when I tried to delete the printer from control panel, it was failed. And when I turned off the PC, the printer still printing by itself.

Finally, I fixed it by holding down the feed button then powering on the printer.

企业局域网内搭建NTP服务器

企业内部各种系统的服务器之间要连接业务,必须保证时间的一致性,如果每台都从外部时间服务器同步时间,是不太现实的,其中一种情况就是某些服务器不允许连接Internet。

所以可以考虑在内部搭建一台NTP服务器,由它从外部同步时间,其他服务器在从这台内部服务器同步时间即可。

如果你的局域网内有Windows域控制器,就比较简单了。

首先,在PDC主机上执行命令:
w32tm /config /manualpeerlist:ntp.neu.edu.cn  /syncfromflags:manual /reliable:yes /update
将PDC主机的时间源设置为某NTP服务器,此处为东北大学的时间服务器ntp.neu.edu.cn,你也可以更改为自己喜欢的。

然后依次执行下列命令,重启时间服务:
W32tm /config /update
Net stop w32time && Net start w32time
W32tm /resync
保险起见,可执行命令
w32tm /query /status
查看PDC服务器的时间源是你选择的那个。

最后去你的其他应用服务器设定从这台域控同步时间,Windows服务器直接在控制面板找“日期和时间”里的“Internet时间”,将时间服务器设为你的域控IP或DNS Name;如果是Linux的系统,首先确定已安装ntpdate,再在crontab里增加一笔定时同步就好了。

参考资料:学领未来

2018/08/27

在Chrome的Secure Shell中清除known_hosts

最近频繁在一个Raspberry Pi上插入不同的TF卡,运行不同的Raspbian,然后从办公用电脑的Chrome用Secure Shell连接Raspbian,导致其保存的known_hosts混乱,无法连接,错误如下:
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
 Someone could be eavesdropping on you right now (man-in-the-middle attack)!
 It is also possible that a host key has just been changed.
 The fingerprint for the ECDSA key sent by the remote host is
 SHA256:po6Fye+CR7Xw7DUrF7jsk8EKYF21utA4733iaGa2yjs.
 Please contact your system administrator.
 Add correct host key in /.ssh/known_hosts to get rid of this message.
 Offending ECDSA key in /.ssh/known_hosts:17
 ECDSA host key for 192.168.3.166 has changed and you have requested strict checking.
 Host key verification failed.
 NaCl 插件已退出,状态代码为:255。
 重新连接(R)、选择其他连接(C)或退出(E)
处理方法是,在错误界面上同时按 CTRL +Shift +J,以进入JavaScript console,在窗口左下角点击“console“,录入以下命令并回车:
term_.command.removeKnownHostByIndex(17);
注意上面这个“17”是我的错误提示中的Index,请替换成你自己的。
回车后,虽然Console反馈undefined, 但其实已经成功了,关闭Console,再重新连接你的host即可。

2018/06/27

让Debian9自动启动到命令行界面

用Debian当服务器,没必要启动图形界面(GUI),避免浪费系统资源,所以想默认启动到命令行界面(CLI)。
此方法仅在Debian9.4上做了测试,想必Debian9的都OK。
步骤:
  1. 以sudo或直接以root身份登录命令行;
  2. 执行systemctl get-default,得到当前的默认登录模式,若为graphical.target,则为图形界面;
  3. 执行systemctl list-units --type=target列出当前支持的启动模式;
  4. 若第3步中有multi-user.target,则表示支持启动到命令行界面,执行systemctl set-default multi-user.target,将其设定为默认启动到命令行界面;
  5. 可以再执行systemctl get-default,确认下,没问题的话,就执行reboot重启电脑吧。
应该已经OK了。
后续想默认启动到GUI界面,那就反向执行上述步骤。

参考资料:IT'zGeek

2018/06/26

TIPTOP不能登录的处理办法

状况:用户登录不了Tiptop,web端打开就报错DVM connection timed out,从terminal也开启不了程序,包括编译画面或4gl程序也失败。
处理办法:用root执行以下命令
cd /u1/flm 
./envflm  #设定环境变量 
flmprg -s #关闭flm (flmprg实际位于$FLMDIR/bin 
flmprg -r #重启flm
还不行,就把OS重启下吧。

参考资料:wangxia279624 

2018/06/25

Tiptop ERP 开启和关闭MFG系统

年中/年终盘点时,管理人员希望把ERP系统关闭,虽然成本关账作业asmp620能设定关账日,设置后,关账日之前的库存则不可异动,但如果更绝对一点,任何时间点的账务都不允许异动,那就得关闭MFG系统了。作业代号为asms999,与它对应的是asms000(MFG 系统重新开启作业)。
asms999的作用是:与生产制造有关的库存管理、料件维护与BOM产品结构、生产管理系统、采购管理系统都仅只提供查询、列印,其它维护都不可作业。销售出货、财务会计等其它模块依然可正常使用。

参考文章:李艺辉的专栏

2018/05/27

Tiptop服务器硬盘空间满

前段时间通过给Tiptop的AP服务器启用外部SMTP发邮件,配合Shell脚本,侦测到AP服务器的磁盘空间使用率达到80%时,会自动发邮件出来。

本次出现空间不足的是根目录,(注:u1:4gl程序及AP配置文件等存放位置;u2:若AP与DB在同一台Server,则用于存放Oracle相关文件;u3:备份文件所在磁盘),利用df和du命令配合,最终查出是apache2的日志文件access_log文件持续增长造成的,有两个办法可以解决该问题:

一、禁止apache2产生log文件,方法如下,但这不符合信息安全的要求,不推荐。
找到apache2的配置文件httpd.conf,将access_log的配置行注释掉即可。
二、让access_log定期产生独立的文件,在将超过期限的独立的日志文件清除。
也是在apache2的配置文件httpd.conf中,修改access_log的配置行,用apache2自带的ratatelogs工具,让日志每天产生一个新文件。
CustomLog "|bin/rotatelogs -l /var/log/logfile_%Y%m%d 86400" common
注意上述路径需为绝对路径。

自动清除超过期限(此处为90天)的日志文件,将下面的命令加入crontab:
find /var/log/logfile_* -mtime +90 -exec rm -f {} \; 
参考资料: Apache官方文档

2018/05/17

Tiptop:用SQL脚本和Shell脚本自动发Excel报表给用户

Tiptop服务器启用外部SMTP发邮件后,一些简单的报表必须要通过邮件发给User时,就不必麻烦去写CR报表了,可以用SQL脚本和Shell脚本配合完成,而且效果也不错。

简单的步骤如下:

一、写SQL脚本。SQL语句先加上如下内容,保证输出资料的可读性。
set linesize 200
set term off verify off feedback off pagesize 999
set markup html on entmap ON spool on preformat off
SPOOL filename.xls;
  以上前三行是为了规范Excel的格式,最后一行是指定输出文件的位置和文件名。请自行调整。
  然后在SQL脚本文件中加入你的SQL语句,以及最后一行为
SPOOL OFF ;
  最后将其保存,例如文件后为myquery.sql。

二、写Shell脚本。直接贴我的吧。
!/bin/sh
export LANG=en_US.utf8
export ORACLE_BASE=/u2/oracle;
export ORACLE_HOME=/u2/oracle/product/11.2.0/dbhome_1;
export ORACLE_SID=topprod;
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8;
export PATH=$PATH:/usr/bin:sbin:/usr/sbin:/usr/contrib/bin:$ORACLE_HOME/bin
cd /yourpath
sqlplus username/password @./myquery.sql〈〈EOF 
quit
EOF
filename=filename.xls
filesize=`ls -l $filename | awk '{ print $5 }'`
normail_size=$((19))
if [ $filesize -ne $normail_size ]
then
        echo "" | mailx -a $filename -s "Email Subject" username@mydomain.com
fi
其中第二到七行为环境变量声明,以避免权限问题和字符集混乱等。第九行中EOF前的尖括号请替换为半角,此处是调用SQL脚本以得到查询结果。第12行的文件名需与SQL脚本中声明的一致。后面几行是用ls和awk得到文件大小,如果是19个字节,就跳过了,因为"no rows selected"加上其前后的换行符等,就刚好19bytes,这个方法其实不算高明,但够用了。😀

最后,如果文件大小不等于19bytes,那就直接把SQL输出的文件作为附件发出了。

我挺喜欢这种方式的,你呢?

参考资料:云和恩墨

CR报表错误:certid驗證失敗 無法開啟報表

今天在Toptest应User需求调整CR报表对应程序后,做测试,程序调用IE浏览器显示报表时,出现错误提示:
certid驗證失敗 無法開啟報表
原来是因为最近把Oracle数据库迁移到了另一台Server,只在AP端改了数据库连接设定,CR服务器的却忘记了。

去Net Manager或直接修改tnsnames.ora文件即可搞定。

2018/05/09

Oracle 默认用户密码的由来

接触过Oracle数据库的朋友可能多少会好奇,为什么Oracle的初始用户和密码是scott和tiger,其由来为何?

Oracle大牛Tony Jambu曾权威解释说:
Scott是Oracle的前身Software Development Laboratories的第4位职员,他是Oracle V1到V3的联合设计师和联合架构师,其全名为Scott Bruce。而tiger是他的宠物猫的名字。

参考信息: Burleson Consulting

2018/04/17

Tiptop ERP AP主机通过外部SMTP发邮件

Redhat Linux本身内置了sendmail和postfix等邮件服务器工具,但配置相当麻烦,而且还会增加服务器性能的开销,所以如果只是想通过脚本监控OS和Database的运行状况,不如直接使用已有的SMTP服务器来发邮件。

首先,把本机的sendmail或postfix服务永久关闭。
#service sendmail stop 
#chkconfig sendmail off 
#service postfix stop 
#chkconfig postfix off
以上命令需以root身份执行。

完成后,还需要对mailx命令进行升级(至12.4 7/29/08,查询命令mailx -V),因为RHEL5本身的mailx版本较低(为8.1.1-44.2.2,查询命令rpm -qa|grep mailx),发送邮件会失败。

因为没有购买RHEL的服务,所以手动去http://www.filewatcher.com/m/mailx-12.4.tar.bz2.271482.0.0.html下载安装包,然后安装
#tar jxvf mailx-12.4.tar.bz2  
#cd mailx-12.4  
#make  
#make install UCBINSTALL=/usr/bin/install 
安装完成后,查看mailx的版本(命令whereis mailx),仍是旧的,是因其软链接需手动建立。
#cd /bin
#rm -rf mailx
#ln -s /usr/local/bin/mailx mailx 
再查询mailx的版本,发现已经是12.4 7/29/08了。

好了,接着开始配置连接外部SMTP服务器的信息,用vim或其他文本编辑工具打开/etc/nail.rc,添加以下内容:
set from=tiptop@maxwa.xyz
set smtp=smtp.maxwa.xyz
set smtp-auth-user=tiptop
set smtp-auth-password=yourpassword
set smtp-auth=login
保存退出后,就可以测试一下了。
echo "hello world" | mailx -v -s "Test only" max@maxwa.xyz 

参考资料:Linux公社  狗窝

2018/04/16

[转]Tiptop成本计算函数结构表


   p500_ask() –询问画面
   p500_del()—删除成本相关资料cch_file,ccg_file,,ccu_file, cct_file,ccc_file,cce_file
   p500()----成本计算主函数
 3.1.  p500_get_date()---获取成本计算日期
 3.2.  p500_last0()---取上期结存转本月期初
  3.2.1  p500_ckp_ccc()---ccc为空,则指定其为0
 3.3.  p500_ccc_0()---清空ccc_file,给一个零
 3.4.  p500_last()---取上期结存转本月期初
 3.5.  p500_wip()---处理 WIP 在制成
  3.5.1 wip_del()---delete ccg_file, cch_file,cce_file 该主件相关资料
  3.5.2 wip_1()---计算每张工单的 WIP-主件 部份 成本
  3.5.3 wip_2()---计算每张工单的 WIP-元件 投入 成本 (cch)
3.5.3.1 wip_2_1() --WIP-元件 上期期末转本期期初
3.5.3.2 wip_2_21()--WIP-元件 本期投入材料 (依工单发料/退料档)
  3.5.3.2.1 p500_cch_01() ---# cch 0
3.5.3.3 wip_ccg21()--计算每张工单的 WIP-主件 投入数量 -> 有争议
3.5.3.4 wip_2_22() ---  WIP-元件 本期投入人工制费
3.5.3.5 wip_2_23()--- WIP-元件 本期投入调整成本
  3.5.4 wip_3()---计算每张工单的 WIP-元件 转出 成本 (cch)
3.5.4.1 -- wip_32()---WIP-元件 本期转出成本 (实际成本制)
  3.5.4.1.1 p500_sub(l_sfa.sfa01,l_sfa.sfa03,l_sub_qty)
  3.5.4.1.2 p500_sub(l_cch.cch01,l_cch.cch04,l_sub_qty)
  3.5.5 wip_4()---计算每张工单的 WIP-主件 SUM  成本
 3.6.  p500_wip2()----处理重复性生产WIP(计算产品在制成本(,,)投入,)
  3.6.1 wip2_1()--计算产品WIP主件  ccg
  3.6.2 wip2_2()--计算每张工单的 WIP-元件 投入 成本 (cch)
    3.6.2.1 wip2_2_1()    # step 1. WIP元件 期初
    3.6.2.2 wip2_2_21()   # step 2-1. WIP元件 本期投入材料 (依发料/退料档)
    3.6.2.3 wip2_2_22()   # step 2-2. WIP元件 本期投入人工制费
    3.6.2.4 wip2_2_23()   # step 2-3. WIP元件 本期投入调整成本
  3.6.3 wip2_3()--计算每张工单的 WIP-元件 转出 成本 (cch)
  3.6.4 wip2_4()--计算产品WIP主件 SUM cch  (ccg)
 3.7.  p500_tlf()--- tlf_file 计算各类入出库数量, 采购成本
        p500_upd_cxa09(l_apb12,l_apb09,1)
        p500_ccc22_cost()
         p500_ccc44_cost()
 3.8.  p500_ccb_cost()---计算入库调整金额
 3.9.  p500_ccg_cost()---计算wip入库调整金额
 3.a.  p500_ccg3_cost()---计算wip入库调整金额(重复性生产)
 3.b.  p500_ccc_tot(p_sw)--- 计算所有出库成本及结存
        p500_ccc_ccc26()
        p500_ccc_ccc23()
  3.b.1 p500_tlf21_upd()----回写tlf21的成本--update 
        p500_get_tlf21(p_tlf01,p_tlf10,p_chr,p_flag)
 3.c.  p500_ccc_ins()----insert ccc
 3.d.  p500_can_upd()---加上销货收入调整金额
 3.e.  p500_rework()----计算重工工单
  3.e.1 p500_rework1()  ---先算 WIP 及 完成品入库
3.e.1.1 p500_wip_rework()  --处理 WIP 重工成本 (重工sfb99='Y')
   wip_1()       # 计算每张工单的 WIP-主件 部份 成本 (ccg)
   wip_2()       # 计算每张工单的 WIP-元件 投入 成本 (cch)
   wip_3()       # 计算每张工单的 WIP-元件 转出 成本 (cch)
   wip_4()       # 计算每张工单的 WIP-主件 SUM  成本 (ccg)
  3.e.2  p500_rework2()  ---再算所有出库成本及结存
    3.e.2.1 p500_ccg2_cost()    --加上WIP重工入库金额
    3.e.2.2 p500_ccc_tot('2')    --计算所有出库成本及结存
    3.e.2.3 p500_ccc_upd()       --Update ccc_file
  3.e.3  p500_wipx0()    ---记录WIP-拆件式工单 在制成本 (工单性质=11) --因为要取重工后单价
    3.e.3.1 p500_wipx()---处理 WIP 在制成本 (工单性质=11拆件工单)                  
 3.f .  p500_reshare()--对于 联产品入库分摊 部份, 进行第二次处理
3.f.1  p500_ccg4_cost()    -- 计算联产品入库分摊
  3.f.2  p500_ccc_tot('3')    --计算所有出库成本及结存
  3.f.3  p500_ccc_upd()      -- Update ccc_file
 3.g .  p500_reshare2()---对于 拆件式入库分摊 部份, 进行处理
3.g.1  p500_ccg5_cost()   --计算拆件式入库分摊
  3.g.2  p500_ccc_tot('3')  -- 计算所有出库成本及结存
  3.g.3  p500_ckp_ccc()   --CHECK ccc_fileNOT NULL栏位的判断
  3.g.4  p500_ccc_upd()     -- Update ccc_file
 3.h .  p500_cct2ccg()--cct_file,ccu_file写入ccg_file,cch_file
   p500_out()----显示成本计算错误讯息(ccy_file)
 4.1   p500_rep()---显示成本计算错误讯息(ccy_file)

作者:罗向锋

2018/04/10

初探Oracle的审计功能

早上有Tiptop的User反馈,凭证抛转还原时,提示表被锁,于是打开p_zta准备解锁,但输了几次Oracle的system和sys密码,都提示不正确。还以为是上月发生信息安全事件后,新改的管理员密码被我记错了,再跟Keepass核对,发现密码没问题。

于是用相同的密码从sqlplus尝试,提示:“ORA-28000: the account is locked”,居然是system帐户被锁定了。查资料发现:
可能是由于错误的密码输入次数超出了profile中failed_login_attempts 次数的限制而被锁定。
 通过如下SQL语句可以查看用户状态和被锁定时间:
SELECT username,account_status,lock_date FROM dba_users;
那就先解锁再说吧,语句如下:
alter user system account unlock; 
 处理完User的问题继续来追查system帐号被锁的原因。首先以sys的身份看Oracle是否已开启审计功能,过程及结果如下:

show parameter audit;

上图中,audit trial的值为DB,说明审计功能已开启,audit_file_dest的value是审计文件存储的位置。遂以OS的oracle用户身份查看审计文件,可令人失望的是,这里只记录了sys用户登录的审计结果,但我的问题是system用户因连续10次输入密码错误被锁定了。值得提一下的是,在这个审计文件中,STATUS的值为0表示正常登录,1017为登录失败。

又查了资料,原来普通的帐户登录,没有相应的os审计文件,但是被添加到了表SYS.AUD$,这下终于揪出原因了(是某个没有数据库管理员权限的同事在反复试system的密码)。我用的相关SQL语句如下:
SELECT userid, userhost, terminal, clientid,ntimestamp#,comment$text
FROM aud$
WHERE returncode=1017 AND userid='SYSTEM'
ORDER BY 5;
参考资料: 乐沙弥的世界

2018/03/09

记Tiptop ERP服务器被植入恶意程序

昨天早上,有User反映Tiptop ERP程序运行缓慢,接连又有反馈说无法登录。具体提示为:
GDC端:DVM connection timed out.
Web端:Application DUA not found 
第一反映是去Terminal执行top命令,看系统的健康状况。数据把我吓一跳,用户空间占用CPU已达75%多,而其中有一个以root身份运行的名为xxm进程,CPU时间占用百分比为1199.3。这个进程也没见过啊,第一时间联系客服人员,被告知要请系统工程师(SE)确认,几乎马上被告知,被植入了恶意程序,如果要处理,需要另付4小时的工时费。没办法,那就赶紧吧,系统不能停摆啊……

与此同时,我自己也在摸索找到恶意程序。先用kill把进程杀掉,再用find -name去找xxm这个文件的位置(后来才知道在top界面按c就能看到),然后把它删除,没一会儿CPU负载又升起来了,xxm又来了,立即去看ctontab,果然是每30分钟从某个位置复制产生该文件,并运行。如此总算可以完全清除了。快4小时的时候,SE也告之说完全处理OK了,时间拿捏的真好。

而ERP不能登录,是因为负责分发License的程序flm运行不起来,在此期间TOPTEST也不能登录,是因为使用同一个License服务程序。其实上面的恶意进程清除后,重启服务器或运行flmprg –r就好了。后悔花了4小时的工时费。

后来,又参考了网上诸多资料,加上个人的一点经验,终于把幕后黑手的行踪找出来了,大年初一那天,幕后黑手通过VPN登入公司ERP主机,用的是root帐号,同时还用mstsc登入了CR服务器,这里留下了他的电脑名称,只可惜负责网络的同事没能找到VPN登录的日志,一条重要线索丢失。

结论:熟人作案,而且手段并不高明,留下很多痕迹。

教训:

  1. VPN不能常开,而且要保留足够长时间的日志;
  2. OS和Oracle的密码都不能直接告诉服务厂商,远程协助要有人值守。