• [设备专区] HUAWEI_5288_V3 ssh 登陆不能执行命令
    用ssh 连接bmc,可以正常连接,连接上去执行命令正常.用"ssh 命令行"带上"ipmcget  -d health" 或者其它命令,不会直接返回命令结果, 会出现"iBMC:/>",看起来像是 把命令丢掉了.ssh -vvv 如下显示 :debug1: Sending command: ipmcget  -d healthdebug2: channel 0: request exec confirm 1debug3: send packet: type 98debug2: channel_input_open_confirmation: channel 0: callback donedebug2: channel 0: open confirm rwindow 0 rmax 32768debug2: channel 0: rcvd adjust 2097152debug3: receive packet: type 99debug2: channel_input_status_confirm: type 99 id 0debug2: exec request accepted on channel 0iBMC:/->exit   这个是我手动输的debug3: receive packet: type 96debug2: channel 0: rcvd eofdebug2: channel 0: output open -> draindebug2: channel 0: obuf emptydebug2: channel 0: chan_shutdown_write (i0 o1 sock -1 wfd 5 efd 6 [write])debug2: channel 0: output drain -> closeddebug3: receive packet: type 98debug1: client_input_channel_req: channel 0 rtype exit-status reply 0debug3: receive packet: type 98debug1: client_input_channel_req: channel 0 rtype eow@openssh.com reply 0debug2: channel 0: rcvd eowdebug2: channel 0: chan_shutdown_read (i0 o3 sock -1 wfd 4 efd 6 [write])debug2: channel 0: input open -> closeddebug3: receive packet: type 97debug2: channel 0: rcvd closedebug3: channel 0: will not send data after closedebug2: channel 0: almost deaddebug2: channel 0: gc: notify userdebug2: channel 0: gc: user detacheddebug2: channel 0: send closedebug3: send packet: type 97debug2: channel 0: is deaddebug2: channel 0: garbage collectingdebug1: channel 0: free: client-session, nchannels 1debug3: channel 0: status: The following connections are open:  #0 client-session (t4 r0 i3/0 o3/0 e[write]/0 fd -1/-1/6 sock -1 cc -1)debug3: send packet: type 1debug3: fd 1 is not O_NONBLOCKTransferred: sent 2388, received 2612 bytes, in 273.3 secondsBytes per second: sent 8.7, received 9.6debug1: Exit status 0求各位老大帮忙看看. 
  • CloudShell登录超时后退回到CloudIDE界面
    超时后,直接退回到CloudIDE的页面重新进入,还需要继续从控制台-》ECS-》远程登录,不太方便。
  • [技术干货] 使用Shell脚本如何启动/停止Java的jar程序
    启动脚本:start_upload.sh123#!/bin/shnohup java -jar UploadSchedule.jar >> /usr/local/tomcat9/webapps/upload-to-oss/nohup_upload.out 2>&1 &echo $! > /var/run/UploadSchedule.pid 启动脚本说明:1、开启后台执行,并将程序产生的日志文件写入out文件;2、将当前进程id写入/var/run/UploadSchedule.pid,以供在停止脚本中使用此pid来停止当前进程。停止脚本:stop_upload.sh123#!/bin/shPID=$(cat /var/run/UploadSchedule.pid)kill -9 $PID 停止脚本说明:1、首先获取进程id;2、然后杀掉该进程。文件切分:split_nohup.sh程序不中断,一直在后台运行,那么产生的log也会持续输出到out问价,导致out文件越来越大。当需要根据out文件进行一些日志查找的时候,非常不方便。所以定期对out文件进行切分,按日期将当日out文件切分成若干小文件,从而方便处理及错误查找定位。12345678910#!/bin/bashlog_path=/usr/local/tomcat9/webapps/upload-to-oss if [ -f "$log_path/nohup_upload.out" ];thencurrent_date=`date -d "-1 day" "+%Y%m%d"`cp $log_path/nohup_upload.out $log_path/nohup_upload_${current_date}.outcat /dev/null > $log_path/nohup_upload.outsplit -b 5242880 -d -a 4 $log_path/nohup_upload_${current_date}.out $log_path/nohup_upload_${current_date}_rm -rf $log_path/nohup_upload_${current_date}.outfi切分脚本说明:1、如果out文件存在,将nohup_upload.out文件复制一份,命名为nohup_upload_当前日期(比如nohup_upload_20200328.out);2、将nohup_upload.out文件清空;3、对nohup_upload_20200328.out文件进行切分,切分后的文件命名格式为nohup_upload_20200328_0001,nohup_upload_20200328_0002;-b 指定每个小文件的大小(单位byte)-d 以数字作为后缀-a 指定后缀的长度4、将原文件(nohup_upload_20200328.out)删除。执行开启/停止命令12345# 启动./start_upload.sh # 停止./stop_upload.sh一些后台运行的小知识&和nohup区别:&的意思是在后台运行。意思是说, 当你在执行 ./start_upload.sh & 的时候, 即使你用Ctrl + C, 那么start_upload.sh照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉Shell后, 那么, start_upload.sh进程同样消失。 因为对SIGHUP信号不免疫。nohup的意思是忽略SIGHUP信号, 所以当运行nohup ./start_upload.sh的时候, 关闭Shell,start_upload.sh进程还是存在的(对SIGHUP信号免疫)。 但是如果你直接在Shell中用Ctrl + C, 那么,start_upload.sh进程也是会消失的(因为对SIGINT信号不免疫)所以,要让进程真正不受Shell中Ctrl + C和Shell关闭的影响, 就用nohup和&同时用。
  • [技术干货] shell脚本中$符号的命令使用汇总
     今天是远程办公的第4天,渐渐的找到了一点在家办公的节奏了,改了几个shell脚本,在改动过程中,发现还有一些知识点需要巩固,这里写出来,加深下印象。   关于$符号,大家肯定都不陌生,在shell脚本中,$的作用还是比较大多的,这里将所有的$组合都列出来,大家可以看下效果。   $组成的命令大概有下面几个:$0,$1...$?,$!,$$,$*,$#,$@下面分别看看这些意思是什么:1.$0,$1$0和$1比较好理解,他们的意思,分别是脚本名称和脚本的第一个参数,我们举个例子来看:123456789jwfyyzdembp:tmp jwfyyz$ cat test.shecho '$0的含义是':$0echo '$1的含义是':$1jwfyyzdembp:tmp jwfyyz$ ./test.sh yeyz$0的含义是:./test.sh$1的含义是:yeyzjwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz$0的含义是:test.sh$1的含义是:yeyz   需要注意一点,当使用./test.sh的方法来运行脚本的时候,$0的值是./test.sh,而不是test.sh2.$?$?指的是最后运行的命令的执行返回码,执行成功,则返回0,否则返回1,举例如下:123456789101112131415jwfyyzdembp:tmp jwfyyz$ cat test.sh echo '$0的含义是':$0echo '$1的含义是':$1ls -l a.txtecho '$?的结果是'$?ls -l test.shecho '$?的结果是'$? jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz$0的含义是:test.sh$1的含义是:yeyzls: a.txt: No such file or directory$?的结果是1-rwxr-xr-x 1 jwfyyz wheel 124 2 7 20:32 test.sh$?的结果是0   可以看到,第一次运行ls -l a.txt的时候,由于我们的目录中没有a.txt这个文件,所以返回是1,第二次由于test.sh文件是存在的,所以返回的结果是03.$$  $$指的是脚本运行的当前进行id号,举例如下:1234567891011jwfyyzdembp:tmp jwfyyz$ cat test.sh pwdecho $$sleep 10 jwfyyzdembp:tmp jwfyyz$ sh test.sh &[1] 60658 jwfyyzdembp:tmp jwfyyz$ ps -ef|grep test 501 60658 60529 0 8:36下午 ttys000 0:00.01 sh test.sh 501 60661 60529 0 8:36下午 ttys000 0:00.00 grep test   我们在test.sh脚本后面设置了sleep 10的命令,脚本运行完会睡眠10s,脚本中打印出来了值60658,此时我们查看当前脚本的进程号,发现子进程的进程id是606584.$*和$@  这两个放在一起,主要是因为他们都代表引用的所有参数,单独打印出来结果,都是一样的,但是循环打印他们的内容,则会看出区别,举例如下:1234567891011121314151617181920212223jwfyyzdembp:tmp jwfyyz$ cat test.sh echo '$*的结果是':$*echo '$@的结果是':$@echo "-- \$* 演示 ---"for i in "$*"; do echo $idone echo "-- \$@ 演示 ---"for i in "$@"; do echo $idone jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3$*的结果是:yeyz 1 2 3$@的结果是:yeyz 1 2 3-- $* 演示 ---yeyz 1 2 3-- $@ 演示 ---yeyz123   可以看到,循环打印的时候,$@ 5.$#  $#容易理解,它的意思是参数的个数。举例:123456789jwfyyzdembp:tmp jwfyyz$ cat test.sh echo '$*的结果是':$*echo '$@的结果是':$@echo '$#的结果是':$# jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3$*的结果是:yeyz 1 2 3$@的结果是:yeyz 1 2 3$#的结果是:46.$!  该命令是显示shell脚本中上一个后台执行命令的进程id号,如下:12345678910111213141516171819jwfyyzdembp:tmp jwfyyz$ cat test.sh echo '$*的结果是':$*echo '$@的结果是':$@echo '$#的结果是':$#sleep 10 &echo '$!的结果是':$!sleep 10 jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3 &[1] 61237$*的结果是:yeyz 1 2 3$@的结果是:yeyz 1 2 3$#的结果是:4$!的结果是:61238 jwfyyzdembp:tmp jwfyyz$ ps -ef|grep sleep 501 61238 61237 0 9:12下午 ttys000 0:00.00 sleep 10 501 61239 61237 0 9:12下午 ttys000 0:00.00 sleep 10 501 61241 60529 0 9:12下午 ttys000 0:00.00 grep sleep  在test.sh中,我们使用了sleep 10这样的命令在后台执行,然后我们可以看到,$!返回的值是61238,当我们ps -ef命令去查询进程信息的时候,可以看到,61238这个进程对应的命令就是sleep 10,注意和$$区分开来,$$反应的是当前脚本执行的进程号,$!反应的是脚本中某个命令的进程号。
  • [技术干货] H实用技巧:全量+增量数据的迁移方法
    背景在Hbase使用过程中,使用的Hbase集群经常会因为某些原因需要数据迁移。大多数情况下,可以跟用户协商用离线的方式进行迁移,迁移离线数据的方式就比较容易了,将整个Hbase的data存储目录进行搬迁就行,但是当集群数据量比较多的时候,文件拷贝的时间很长,对客户的业务影响时间也比较长,往往在客户给的时间窗口无法完成,本文给出一种迁移思路,可以利用Hbase自身的功能,对集群进行迁移,减少集群业务中断时间。简介大家都知道Hbase有snapshot快照的功能,利用快照可以记录某个时间点表的数据将其保存快照,在需要的时候可以将表数据恢复到打快照时间时的样子。我们利用Hbase的snapshot可以导出某个时间点的全量数据。因为用户的业务还在不停的写入表中,除了迁移快照时间点之前的全量数据,我们还需要将快照时间点后源源不断的增量数据也迁移走,这里如果能采用双写的方式,将数据写入两个集群就好了,但是用户的业务不会这样做,如果这样做还得保证双写的事务一致性。于是可以利用Hbase的replication功能,replication功能本身就是保留了源集群的WAL日志记录,去回放写入到目的集群,这样一来用户业务端->原始集群->目的集群便是个串形的数据流,且由Hbase来保证数据的正确性。所以这个迁移的方法就是利用snapshot迁移全量数据,利用replication迁移增量数据。迁移步骤上图给出了迁移的整个时间线流程,主要有这么5个时间点。T0: 配置好老集群A集群到新集群B的Replication关系,Replication的数据由A集群同步到集群B,将表设置成同步,从此刻开始新写入A集群表的数据会保留在WAL日志中;T1: 生成该时间点的全量数据,通过创建快照,以及导出快照数据的方式将该时间点的数据导出到新集群B;T2: 新集群B将T1时刻的快照数据导入,此时新集群B中会由快照创建出表,此时老集群A集群上设置的Replication的关系会自动开始将T0时刻保留的WAL日志回放至新集群B的表中,开始增量数据同步。T3: 由于从T0-T3之间的操作会花费一段时间,此时会积累很多WAL日志文件,需要一定的时间来同步至新集群,这里需要去监控一下数据同步情况,等老集群WAL被逐渐消费完,此时可以将老集群的写业务停止一下并准备将读写业务全部切到新集群B。T4: T3-T4之间应该是个很短的时间,整个迁移也只有这个时间点会有一定中断,此时是让用户将业务完全切到新集群B,至此迁移完成。操作涉及的命令1.设置集群A和集群B的peer关系在源集群Hbase shell中, 设定peeradd_peer 'peer_name','ClusterB:2181:/Hbase'2.在集群A的表中设置replication属性假设目标表名为Student,先获取Family=f进入Hbase shell中,alter 'Student',{NAME => 'f',REPLICATION_SCOPE => '1'}3.给集群A的表创建快照在Hbase shell中snapshot 'Student','Student_table_snapshot'4.在A集群中导出快照Hbase org.apache.hadoop.Hbase.snapshot.ExportSnapshot -snapshot Student_table_snapshot -copy-to /snapshot-backup/Student5.将快照数据放置到集群B的对应的目录下上面命令会导出2个目录,一个是快照元数据,一个是原始数据将元数据放到/Hbase/.Hbase-snapshot中,将原始数据放到/Hbase/archive目录中由于Hbase的archive目录会有个定时清理,这里可以提前将集群B的master的Hbase.master.cleaner.interval值设置大点,避免拷贝过程中发生碰巧发生了数据清理。如果集群B中没有对应的目录,可以提前创建hdfs dfs -mkdir -p /Hbase/.Hbase-snapshothdfs dfs -mkdir -p /Hbase/archive/data/default/移动导出的snapshot文件到snapshot目录hdfs dfs -mv /snapshot-backup/Student/.Hbase-snapshot/Student_table_snapshot /Hbase/.Hbase-snapshot/hdfs dfs -mv /snapshot-backup/Student/archive/data/default/Student /Hbase/archive/data/default/6.在新集群B中恢复表的快照进入Hbase shellrestore_snapshot 'Student_table_snapshot'恢复完成后,记得将集群B的hmaster中Hbase.master.cleaner.interval的值调整回来。
  • [指令翻译工具] 【ExaGear】guest shell下安装golang,运行go version出错。
    问题求助: 1. 根据如下安装指南安装ExaGearhttps://support.huaweicloud.com/ug-exagear-kunpengdevps/kunpengexagear_06_0009.html 2. host OS为CentOS 7.6 PAGE_SIZE为64K 根据如下章节正常部署ExaGear文档首页 > 鲲鹏开发套件 > 指令动态翻译> 用户指南(ExaGear)> ExaGear for Server> 安装ExaGear for Server> 安装ExaGear Server for CentOS with 64kB page size3. 运行exagear命令,进入guest shell,安装epel-release和golang  yum install  epel-release  yum install golang-bin4. exagear运行go 出错请问如何解决?背景:1. 开源软件monkey使用了两条86机器指令(https://github.com/bouk/monkey/blob/master/monkey_amd64.go),如下package monkey// Assembles a jump to a function valuefunc jmpToFunctionValue(to uintptr) []byte {return []byte{0x48, 0xBA,byte(to),byte(to >> 8),byte(to >> 16),byte(to >> 24),byte(to >> 32),byte(to >> 40),byte(to >> 48),byte(to >> 56), // movabs rdx,to0xFF, 0x22,     // jmp QWORD PTR [rdx]}}2.直接在arm上运行,会出现异常 3. 想尝试使用ExaGear解决以上问题
  • [技术干货] mac系统,没有xshell,有什么可以替代的工具吗
    mac系统,没有xshell,有什么可以替代的工具吗
  • [技术干货] 【Hive】Shell客户端登录beeline提示“authentication failed”
    开启安全认证的MRS集群中,执行beeline命令,登录失败,界面提示“authentication failed”关键字,具体信息如下:Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false  Acquire TGT from Cache  Credentials are no longer valid  Principal is null  null credentials from Ticket Cache  [Krb5LoginModule] authentication failed  No password provided处理步骤:cd /opt/clientsource bigdata_env命令,配置环境变量。在客户端中执行如下命令,执行登录操作。kinit user然后重新执行beeline命令登录Hive客户端即可。
  • [热门活动] 安装mind_studio 出现这样的错误Failed to prepare rebootshell. Exit 1
    安装mind_studio 出现这样的错误 Failed to prepare rebootshell. Exit 1,请问怎么解决
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第118期Shc-3.6安装配置指南
    1、简介Shc用来对shell脚本进行加密,它将shell脚本转换为一个可执行的二进制文件,从而避免shell脚本中的用户名、密码等重要信息暴露。类别:加密工具2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包gcc 4.8.5Shc3.6http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz3、依赖安装yum install gcc make  -y4、编译安装    获取软件包cd /usr/local/srcwget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz   解压软件包tar xf shc-3.6.tgz编译和安装shcmkdir /usr/local/man/man1/ -pcd /usr/local/src/shc-3.6make    回显如上图所示,按回车键结束make install   5、系统配置无6、测试touch hello.shchmod +x hello.shvi hello.sh    输入以下信息并保存#!/bin/bash echo "test shc"   执行./hello.sh回显如下图    执行shc -v -f hello.sh对hello.sh脚本进行加密,回显如下(“-v”表示显示加密过程。“-f”指定需要加密的脚本。)                   执行./hello.sh.x,回显如下       查看hello.sh.x架构    7、参考信息无8、FAQ无
  • [中间件] 【华为云鲲鹏云服务最佳实践】【工具篇】第088期Shc-3.6安装配置指南
    1、简介Shc用来对shell脚本进行加密,它将shell脚本转换为一个可执行的二进制文件,从而避免shell脚本中的用户名、密码等重要信息暴露。类别:加密工具2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包shc3.6http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz3、依赖安装yum install gcc make  -y4、组件编译安装  获取软件包cd /usr/local/srcwget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.6.tgz  解压软件包tar xf shc-3.6.tgz编译和安装shcmkdir /usr/local/man/man1/ -pcd /usr/local/src/shc-3.6make           回显如上图。make install          5、系统配置无6、测试touch hello.shchmod +x hello.shvi hello.sh      输入以下信息并保存#!/bin/bash echo "test shc"  执行./hello.sh回显如下图  执行shc -v -f hello.sh对hello.sh脚本进行加密,回显如下(“-v”表示显示加密过程。“-f”指定需要加密的脚本。)   执行./hello.sh.x,回显如下 查看hello.sh.x架构    7、参考信息无8、FAQ无
  • Mongodb查询中游标的使用及相关知识
    本帖最后由 Nosql_newbee 于 2018-4-6 17:03 编辑 游标的使用: MongoDB中,db.collection.find()方法返回一个游标,你可以通过迭代游标来访问文档的内容,在mongo shell中如果没将返回的cursor赋予局部变量(用var定义的变量),游标会自动迭代数据,默认为20行,这就是直接在shell中执行db.user.find()的结果。将返回结果赋予局部变量就可以手动的迭代访问cursor中的数据了。 首先在数据库中**测试数据 for(i=0;i100;i++){db.user.insert({"x":i});} var myCursor = db.user.find(); 可以通过next()方法来访问游标中数据 while(myCursor.hasNext()){ print(tojson(myCursor.next())); } hasNext()检查是否有后续结果存在。 还可以通过forEach()来迭代cursor访问文档, myCursor.forEach(printJson); https://docs.mongodb.com/manual/reference/method/#js-query-cursor-methods 可以在这个网址查看更多的cursor方法。 调用find时,shell并不立即查询数据库,而是等待真正开始要求获得结果时才发送查询,这样在执行之前可以给查询附加额外的选项,几乎游标对象的每个方法都 返回游标本身,这样就可以按任意顺序组成方法链。例如下面几种方法的表达式等价的: var myCursor = db.user.find().sort({"x":1}).limit(1).skip(10); var myCursor = db.user.find().limit(1).sort({"x":1}).skip(10); var myCursor = db.user.find().skip(10).limit(1).sort({"x":1}); 此时,查询还没有真正的执行,所有这些函数都只是构造查询,现在进行如下操作, myCursor.hasNext() 这时,查询被发往服务器。shell立刻获得前100个或前4M的数据(两者之间较小的),这样下次调用next()就不必再次链接服务器获取结果了,客户端使用完第一组数据时,shell会再一次联系数据库,使用getMore请求提取更多的结果。getMore请求包含一个查询标示符,项数据查询是否还有更多的结果,这个过程会一直持续到游标耗尽或者结果全部返回。 limit,skip和sort 要限制结果数量,可在find后使用limit函数,例如,只返回3个结果,可以这样限制 db.user.find().limit(3) 要是匹配的结果不到3个,则返回匹配数量的结果。limit指定的上限,skip与limit类似 db.find().skip(3) 该操作会忽略前三个匹配的文档,然后返回剩余的文档,如果集合中能匹配的文档少于3个,则不会返回任何文档。 sort接受一个对象作为参数,这个对象是一组键/值对,键对应文档的键名,值代表排序的方向。排序的方向1(升序),-1(降序),如果指定了多个键,则按照这些键被指定的顺序逐个排序,例如,按照"username"升序,按照"age"降序,可以这样写 db.user.find().sort({"username":1,"age":-1}) 这三个方法组合使用,对于分页非常有用,例如在线商店,要显示商品,每页50个,按照价格降序排列,可以这样写: db.user.find({"name":"mp3"}).limit(50).sort({"price":1}) 当用户点击下一页时, db.user.find({"name":"mp3"}).limit(50).sort({"price":1}).skip(50) 然而,skip过多的结果会导致性能问题。
  • [交流分享] xshell替代品,好用的SSH工具
    因为种种原因,公司不让用Xshell了,痛苦之余找到了一个好用的工具 FinalShell: http://www.hostbuf.com/t/988.html
  • 你懂 Linux 吗?关于 Linux 你可能不是非常了解的七件事
    本帖最后由 燕姑娘 于 2017-10-9 17:46 编辑使用 Linux 最酷的事情之一就是随着时间的推移,你可以不断获得新的知识。每天,你都可能会遇到一个新的实用工具,或者只是一个不太熟悉的奇技淫巧,但是却非常有用。这些零碎的东西并不总是能够改变生活,但是却是专业知识的基础。 即使是专家,也不可能事事皆知。无论你有多少经验,可能总会有更多的东西需要你去学习。所以,在这儿我列出了七件关于 Linux 你可能不知道的事情。 一个查找命令历史的交互模式 你可能对 history 命令非常熟悉,它会读取 bash 历史,然后以编号列表的方式输出到标准输出(stdout)。然而,如果你在 curl 命令的海洋里寻找一个特定的链接(URL),那么这个列表并不总是那么容易阅读的。 你还可以有另一个选择,Linux 有一个交互式的反向搜索可以帮助你解决这个问题。你可以通过快捷键 ctrl+r启动交互模式,然后进入一个交互提示中,它将会根据你提供的字符串来向后搜索 bash 历史,你可以通过再次按下 ctrl+r 向后搜索更老的命令,或者按下 ctrl+s 向前搜索。 注意,ctrl+s 有时会与 XON/XOFF 流控制冲突,即 XON/XOFF 流控制也会使用该快捷键。你可以通过运行 stty -ixon 命令来禁用该快捷键。在你的个人电脑上,这通常是有用的,但是在禁用前,确保你不需要 XON/XOFF 。 Cron 不是安排任务的唯一方式 Cron 任务对于任何水平的系统管理员,无论是毫无经验的初学者,还是经验丰富的专家来说,都是非常有用的。但是,如果你需要安排一个一次性的任务,那么 at 命令为你提供了一个快捷的方式来创建任务,从而你不需要接触 crontab 。 at 命令的运行方式是在后面紧跟着你想要运行任务的运行时间。时间是灵活的,因为它支持许多时间格式。包括下面这些例子: 2567 当你以带参数的方式输入 at 命令以后,将会提示你该命令将在你的 Linux 系统上运行。这可能是一个备份脚本,一套维护任务,或者甚至是一个普通的 bash 命令。如果要结束任务,可以按 ctrl+d 。 另外,你可以使用 atq 命令查看当前用户的所有任务,或者使用 sudo atq 查看所有用户的任务。它将会展示出所有排定好的任务,并且每个任务都伴有一个 ID 。如果你想取消一个排定好的任务,可以使用 atrm 命令,并且以任务 ID 作为参数。 你可以按照功能搜索命令,而不仅仅是通过名字 记住命令的名字非常困难,特别是对于初学者来说。幸运的是,Linux 附带了一个通过名字和描述来搜索 man 页面的工具。 下次,如果你没有记住你想要使用的工具的名称,你可以尝试使用 apropos 命令加上你想要干的事情的描述。比如,apropos build filesystem 将会返回一系列名字和描述包括了 “build” 和 “filesystem” 单词的工具。 apropos 命令接受一个或多个字符串作为参数,但同时它也有其他参数,比如你可以使用 -r 参数,从而通过正则表达式来搜索。 一个允许你来管理系统版本的替代系统 如果你曾进行过软件开发,你就会明白跨项目管理不同版本的语言的支持的重要性。许多 Linux 发行版都有工具可以来处理不同的内建版本。 可执行文件比如 java 往往符号链接到目录 /etc/alternatives 下。反过来,该目录会将符号链接存储为二进制文件并提供一个管理这些链接的接口。Java 可能是替代系统最常管理的语言,但是,经过一些配置,它也可以作为其他应用程序替代品,比如 NVM 和 RVM (NVM 和 RVM 分别是 NodeJS 和 Ruby 的版本管理器)。 在基于 Debian 的系统中,你可以使用 update-alternatives 命令创建和管理这些链接。在 CentOS 中,这个工具就叫做 alternatives 。通过更改你的 alternatives 文件中的链接,你便可以安装一个语言的多个版本,并且在不同的情况下使用不同的二进制。这个替代系统也提供了对任何你可能在命令行运行的程序的支持。 shred 命令是更加安全的删除文件方式 我们大多数时候总是使用 rm 命令来删除文件。但是文件去哪儿了呢?真相是 rm 命令所做的事情并不是像你所想像的那样,它仅仅删除了文件系统和硬盘上的数据的硬链接。硬盘上的数据依旧存在,直到被另一个应用重写覆盖。对于非常敏感的数据来说,这会带来一个很大的安全隐患。 shred 命令是 rm 命令的升级版。当你使用 shred 命令删除一个文件之后,文件中的数据会被多次随机覆写。甚至有一个选项可以在随机覆写之后对所有的数据进行清零。 如果你想安全的删除一个文件并且以零覆盖,那么可以使用下面的命令: 2592 同时,你也可以使用 -n 选项和一个数字作为参数,从而指定在随机覆盖数据的时候迭代多少次。 通过自动更正来避免输入很长的无效文件路径 有多少次,你输入一个文件的绝对路径,然而却看到“没有该文件或目录”的消息。任何人都会明白输入一个很长的字符串的痛苦。幸运的是,有一个很简单的解决办法。 内建的 shopt 命令允许你设置不同的选项来改变 shell 的行为。设置 cdspell 选项是避免输入文件路径时一个字母出错的头痛的一个简单方式。你可以通过运行 shopt -s cdspell 命令来启用该选项。启用该选项后,当你想要切换目录时,会自动更正为最匹配的目录。 Shell 选项是节省时间的一个好方法(更不用说减少麻烦),此外还有许许多多的其他选项。如果想查看你的系统中所有选项的完整列表,可以运行不带参数的 shopt 命令。需要注意的是,这是 bash 的特性,如果你运行 zsh 或者其他可供选择的 shell,可能无法使用。 通过子 shell 返回到当前目录 如果你曾经配置过一个比较复杂的系统,那么你可能会发现你需要频繁的更换目录,从而很难跟踪你所在的位置。如果在运行完一个命令后自动返回到当前位置,不是很好吗? Linux 系统实际上提供了一个解决该问题的方法,并且非常简单。如果你想通过 cd 命令进入另一个目录完成一些任务,然后再返回当前工作目录,那么你可以将命令置于括号中。你可以在你的 Linux 系统上尝试下面这个命令。记住你当前的工作目录,然后运行: 2571 该命令会输出 /etc 目录的内容。现在,检查你的当前工作目录。它和执行该命令前的目录一样,而不是 /etc 目录。 它是如何工作的呢?运行一个括号中的命令会创建一个子 shell 或一个当前 shell 进程的复刻副本。该子 shell 可以访问所有的父变量,反之则不行。所以请记住,你是在运行一个非常复杂的单行命令。 在并行处理中经常使用子 shell ,但是在命令行中,它也能为你带来同样的力量,从而使你在浏览文件系统时更加容易。 作者简介: Phil Zona 是 Linux Academy 的技术作家。他编写了 AWS、Microsoft Azure 和 Linux 系统管理的指南和教程。他同时也管理着 Cloud Assessments 博客,该博客旨在帮助个人通过技术实现他们的事业目标。 来自:[color=rgb(61,177,88)]Linux中国 作者:[color=rgb(61,177,88)]PHIL ZONA
  • [技术干货] 华为云服务器shell生成随机密码和生成shadow格式用的密码
    华为云服务器shell生成随机密码 [code][root@hwclouds-ecs-100 ~]# cat /dev/urandom | awk 'NR==1{print $0|"md5sum|base64|grep -Eo '^.{16}'";exit}' YWFhMzA4MmQ4YjBk [root@hwclouds-ecs-100 ~]# /dev/urandom awk 'NR==1{print $0|"md5sum|base64|grep -Eo '^.{16}'";exit}' ODc1ZTQzYTNkYjQ1 [root@hwclouds-ecs-100 ~]# od -N8 -tx8 /dev/random | awk 'NR==1{print $NF}' 9404172875d9c080 [root@hwclouds-ecs-100 ~]# cat /dev/urandom | awk 'NR==1{print $0|"md5sum|head -c 16";exit}';echo dc836360f4ce5c02 [root@hwclouds-ecs-100 ~]# echo "$(date +%s)"|sha256sum|base64|head -c 16;echo YmQzNmRhNDYwNTYx [root@hwclouds-ecs-100 ~]# mkpasswd -l 16 -d 5 -C 5 E5s{2g7yQM7NHgf5 [root@hwclouds-ecs-100 ~]# /dev/urandom tr -dc A-Z-a-z-0-9 | head -c${1:-16};echo; XLGoh2gLkvZTn1o9 [root@hwclouds-ecs-100 ~]# openssl rand -hex 8 f43a35be7dc0122b [root@hwclouds-ecs-100 ~]# dd if=/dev/urandom bs=1 count=32 2>/dev/null |base64|head -c16;echo kuH3aB5lcPP4IPAp [root@hwclouds-ecs-100 ~]#[/code] 华为云服务器shell生成shadow格式用的密码 [code][root@hwclouds-ecs-100 ~]# perl -e 'print crypt("password","\$6\$salt\$") . "\n"' $6$salt$IxDD3jeSOb5eB1CX5LBsqZFVkJdido3OUILO5Ifz5iwMuTS4XMS130MTSuDDl3aCI6WouIL9AjRbLCelDCy.g. [root@hwclouds-ecs-100 ~]# python -c "import crypt, getpass, pwd;print crypt.crypt('password', '\$6\$saltsalt\)" $6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/ [root@hwclouds-ecs-100 ~]# python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\ + raw_input() + '\)" lookback saltsalt $6$saltsalt$a0J/T8m/LXCZ3GWU2k8doYlZYN63LQj7MJnPST15U/v.RpsP5vnt0qtkByqSO/fVa0Qby6BDIi.J94pt3RmKz. [root@hwclouds-ecs-100 ~]# python -c "import crypt, getpass;print crypt.crypt('password')" #上面都是指定salt的,这个就是随机加盐的 $6$hppfi2m5kPwuxG.e$c8IWMJKk6qo8NSdV6sMghnSPolow7ngvQoKlMw6bH/BYogWmExsnxCMVSkVNJdn3jPhQPF/s7t5KkDFiJ3IjU0 [root@hwclouds-ecs-100 ~]#[/code]