【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc
文章目录
- 1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统
- 1.1 变量:readonly定义只读变量,unset删除变量
- 1.2 函数:shell脚本传递的参数中包含空格,应使用单引号或双引号将该参数括起来,以便于脚本将这个参数作为整体来接收。if [ -n str1 ] 当字符串的长度大于0时为真(字符串非空)
- 1.3 运算:算术、关系、布尔、逻辑、字符串、文件运算
- 1.4 流程控制:if、for、while、case
- 2.ssh_tool:sed -i 's/\r//g' 文件(删除从txt复制来代码的换行符)
- 3.build_bmc:To go back to default recipes: devtool reset linux-aspeed , devtool reset u-boot
- 3.1 环境变量:用bash调用脚本的时候会创建一个和自己一模一样的shell子进程执行这个外部命令。这个子进程中设置了自己的运行的环境变量,此时父进程的环境变量并没有改变。bash test.sh == ./test.sh。
- 4.scp_image:不用管STRING1
- 5.bmc_upgrade:断电重启才从主启,当前永远mtd4
- 6.自动升级bmc:AC ON物理上电
1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统
1.1 变量:readonly定义只读变量,unset删除变量


如果字符串中有空格,必须需要使用引号(str=hello world会报错)。


获取字符串长度:echo ${#str} ,expr length “${str}”。
截取字符串:echo ${str:1:4}:显示字符串第1到第4个字符。
echo ${str:4}:从左边第4个字符开始,一直到结束。
echo ${str:0-6:3}:从倒数第6个字符开始的3个字符。
echo ${str:0-6}:从倒数第6个字符开始,一直到结束。
file=/dir1/dir2/dir3/my.file.txt
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt / 可换成 . 即#*.
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)


#!/bin/bash
for i in `ifconfig | grep -o ^[a-z0-9.]*`
doname=$i echo $nameipaddr=$(ifconfig $i|sed -n 2p|awk '{ print $2 }'|tr -d 'addr:') # -d删除echo http://$1:8080/api/slave -d '{"slave":"'$2${name}'","ip":"'${ipaddr}'"}'
done

如下截取 = 号左边即第一个。

"-d")shiftcase ${1} in"lc1" | "lc2" | "cmm" | "fb1" | "fb2");;*)usage;;esacdev=${1}led_devie=${dev%[^a-zA-Z]} # lcif [ "$1" != "cmm" ];thenindex=${dev/*[a-zA-Z]/} # 1fi;;
设置别名,printf,重定向,exit,until,shift,basename/dirname

不添加引号,转义将不被执行,如下转义。

command > /dev/null 2>&1不在屏幕上显示输出结果和错误。/dev/null 是一个特殊文件,写入到它的内容都会被丢弃,从该文件读取内容,什么也读不到。



# a.sh
a()
{return 1
}
if ! a ; thenecho "111"
fi$ ./a.sh
111
# shift.sh
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done$./shift.sh 1 2 3 4
第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1
# shift1.sh
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo "sum is: $sum"$./shift1.sh 10 20 15
结果显示:45
basename /usr/local/nginx/conf/nginx.conf
nginx.conf
basename -s .conf /usr/local/nginx/conf/nginx.conf
nginxdirname //
/
dirname /a/b/
/a
dirname a
.
dirname a/b
arealpath $path : 返回$path的绝对路径,路径不存在会报错,文件不存在不会报错
declare与let:let命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算,不能对小数(浮点数)或字符串运算。


整型运算如上同如下。


test:用于检查某个条件是否成立,它可以进行数值、字符、文件三个方面的测试

1.2 函数:shell脚本传递的参数中包含空格,应使用单引号或双引号将该参数括起来,以便于脚本将这个参数作为整体来接收。if [ -n str1 ] 当字符串的长度大于0时为真(字符串非空)


1.3 运算:算术、关系、布尔、逻辑、字符串、文件运算
算术:

关系:


布尔:

逻辑:



文件测试运算:


1.4 流程控制:if、for、while、case
if:

for:

while:

until:

case:

break与continue:

2.ssh_tool:sed -i ‘s/\r//g’ 文件(删除从txt复制来代码的换行符)
#!/usr/bin/expect
# b文件,llength等是expect中专属的,和ftp那些命令一样
# obmc-server:~$ whereis expect
# expect: /usr/bin/expect /usr/share/man/man1/expect.1.gz
puts "$argv0"set arg_leng [llength $argv]
puts "$arg_leng" set argv_0 [lindex $argv 0]
puts "$argv_0"# @obmc-server:~/test$ ./b w
# ./b
# 1
# w
#!/usr/bin/expect
# 如上一行必须加且必须在第一行
if { [llength $argv] < 1} {puts "Usage:"puts "$argv0 raspberr ttyUSBx <pi2 0>" # ssh-tool.sh pi2 0puts "$argv0 raspberr <pi1> <pi2> <pi3>" # ssh-tool.sh pi1puts "$argv0 project_name <hollywood> <s3ip-bmc> <s3ip-bsp>" # ssh-tool.sh hollywood# puts "$argv0 raspberrNUM ttyUSBx [force]" # ssh-tool.sh pi1 0 force# puts "force if other used tty will kill process,杀串口进程"exit 1
}set arg_leng [llength $argv ]
set argv_0 [lindex $argv 0]
set ttyUSBx [lindex $argv 1]
# set force [lindex $argv 2]
set timeout 20
# set pi3_ip [exec sh -c {curl -s http://10.75.92.228:8080/api/help | python -m json.tool |grep -i "pi3" |cut -d '"' -f 4}]
set pi3_ip 10.75.159.104
set local_file ./tmp/deploy/images/obmc-cl/flash-obmc-cl
set passwderror 0#11111111111111111111111111111111111111111111111111111111111111111111111111
if { $argv_0 == "pi1" } {set passwd 123456spawn ssh pi@$pi1_ip
}
if { $argv_0 == "pi2" } {set passwd 123456spawn ssh pi@$pi2_ip
}
if { $argv_0 == "pi3" } {set passwd 123456spawn ssh pi@$pi3_ip
}
if { $argv_0 == "hollywood" } {set passwd 0penBmcspawn ssh-keygen -f "/home_a/yu/.ssh/known_hosts" -R $hollywood_ipspawn ssh root@$hollywood_ip
}
if { $argv_0 == "docker" } {set passwd 1spawn ssh cit@10.75.159.16expect {"*yes/no*" {send "yes\r"exp_continue}"*assword:*" {if { $passwderror == 1 } {puts "passwd is error"exit 2}set timeout 1000set passwderror 1send "$passwd\r"sleep 0.2send "sudo su\r"sleep 0.2send "$passwd\r"sleep 0.2send "docker exec -it 16d93b0d2026 bash\r"sleep 0.2send "zsh\r"sleep 0.2send "ls\r"sleep 0.2send "cd\r"interact}}
}#11111111111111111111111111111111111111111111111111111111111111111111111111
expect {"*yes/no*" {send "yes\r"exp_continue # 该项被匹配后,还能继续匹配该expect判断语句内的其他项}"*assword:*" {if { $passwderror == 1 } {puts "passwd is error"exit 2}set timeout 1000set passwderror 1send "$passwd\r"if { $arg_leng == 1} {interact # 执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手动操作。# 如果没有该命令,命令完成后即退出。}if { $arg_leng == 2} {exp_continue }}"*pi@raspberrypi*" {send " picocom -b 115200 /dev/ttyUSB$ttyUSBx\r"exp_continue}"*FATAL: cannot lock*" {# if { $force == "force" } {# puts "you can kill process and try again"# exit 1# }send " ps -ef |grep -i ttyUSB$ttyUSBx\r "interact}"*FATAL: cannot open*" {puts "!!! ######################################## !!!"puts "!!!no ttyUSB$ttyUSBx"exit 1}"*Terminal ready*" {interact}
}
3.build_bmc:To go back to default recipes: devtool reset linux-aspeed , devtool reset u-boot
#!/bin/bash# downloads() {
# echo "buildpath: [$buildpath]"
# build_exist=$(grep "DL_DIR" $buildpath/conf/local.conf)
# echo "buildexist: [$build_exist]"
# if [ ! -n "$build_exist" ]; then
# echo "DL_DIR ?= \"/home_a/y/usr/local/downloads\"" >> "conf/local.conf"
# fi
# }# buildplatform() {
# source openbmc-init-build-env meta-huaqin/meta-$1 build-$1
# buildpath=$(pwd)
# downloads
# bitbake $1-image
# rm -rf conf/local.conf
# }usage() {echo "Usage: build an openbmc image"echo " $(basename $0) <platform>"echo " $(basename $0) <platform> <feature>"echo " $(basename $0) <platform> <clean>"echo " $(basename $0) <platform> <clean> <feature>"echoecho "Examples:"echo " $(basename $0) kestrel"echo " $(basename $0) kestrel ipmid"echo " $(basename $0) kestrel clean"echo " $(basename $0) kestrel clean ipmid"
}
# if [ $# -eq 1 ]; then# buildplatform $1
if [ $# -eq 1 ]; thensource ./setup $1;echo "DL_DIR ?= \"/home_a/y/usr/local/downloads_ocp\"" >> "conf/local.conf" # openbmc-hollywood-master/build/conf/local.conf 或 meta-huaqin/meta-xs9880-8c/conf/local.conf.samplebitbake obmc-phosphor-image
elif [ $# -ge 2 ]; thencase $2 in"clean")source ./setup $1;echo "DL_DIR ?= \"/home_a/y/usr/local/downloads_ocp\"" >> "conf/local.conf"bitbake obmc-phosphor-image -c cleanall obmc-phosphor-image;;"u-boot")# source openbmc-init-build-env meta-huaqin/meta-$1 build-$1 && buildpath=$(pwd); downloads; bitbake u-boot;;"linux-aspeed")# source openbmc-init-build-env meta-huaqin/meta-$1 build-$1 && buildpath=$(pwd); downloads; bitbake linux-aspeed;;*)source openbmc-init-build-env meta-huaqin/meta-$1 build-$1 && buildpath=$(pwd); downloads; bitbake $2;;esac
elseusage
fi
exit 0
# build目录下获取源码:devtool modify linux-aspeed ,devtool modify u-boot
# This will create local Linux package under /workspace/sources/linux-aspeed for development
chmod 777 /home_a/y/app/bin/(usr/local/bin/)build_bmc~$ vi .bash_profile
export PATH=/home_a/y/app/bin:$PATH~$ vi .bashrc
alias gr='grep -nr'
3.1 环境变量:用bash调用脚本的时候会创建一个和自己一模一样的shell子进程执行这个外部命令。这个子进程中设置了自己的运行的环境变量,此时父进程的环境变量并没有改变。bash test.sh == ./test.sh。
用source来执行脚本的时候,不会创建子进程,而是在父进程中直接执行,所以当需要程序修改当前shell本身的环境变量的时候,用source命令。source test.sh == . test.sh。如下记住ebe从大到小。

上面就是改变linux的env的三种方法,每个用户env都不一样,env中HOME为用户主目录。

export在命令行单独输入是临时的(export…,env可查到多出了刚export的,但用户登出再登录,env查看没有刚export的)。但在.bash_profile中都含有export,用户一登录就执行.bash_profile,所以env中含有这些环境变量,这样export可视为永久。

所有可执行程序都要PATH指定,如ls,pwd(也是可执行程序)不加./(./是在当前目录执行),因为在冒号分隔(冒号不是连接)的几个目录下找。sqlplus命令行命令在/oracle/bin中。


ls这个可执行程序就是在bin目录下,上面PATH已指定。如下若未改为英文显示:未找到命令(中文)。

如下必须在用户主目录/oracle,才能vi .bash_profile。


如下对所有用户有效。

/etc/profile 是文件(里面有不建议在这文件里修改的英文说明), /etc/profile.d/ 是目录(如下新建.sh文件创建全局环境变量)。

如下在sss.sh中写入下行。/etc/profile这个文件中有这么一段shell:for i in /etc/profile.d/*.sh;,会在每次启动时自动加载profile.d目录中每个配置。

不想要什么变量直接删除 /etc/profile.d/ 下对应的shell 脚本即可,当用户重新登录shell如下或source /etc/profile 时会触发。

4.scp_image:不用管STRING1
#!/usr/bin/expect if { [llength $argv] < 2} { puts "Usage:" puts "$argv0 <Image path> IP" puts "$argv0 <Image path> IP <path>" exit 1
}set timeout 20
set Local_File [lindex $argv 0]
set IP [lindex $argv 1]
set STRING 0
spawn ssh-keygen -f "/home_a/y/.ssh/known_hosts" -R $IPproc myscpfunc { STRING1 } {set passwd 0penBmcset passwderror 0 expect { "*assword:*" { if { $passwderror == 1 } { puts "passwd is error" exit 2 } set timeout 1000 set passwderror 1 send "$passwd\r" exp_continue } "yes/no" { send "yes\r" exp_continue } timeout { puts "connect is timeout" exit 3 }}
}if { [llength $argv] == 2} { if {[regexp -nocase "obmc-phosphor-image" $Local_File]} {spawn scp $Local_File root@$IP:/tmp/imagesmyscpfunc $STRINGspawn scp /home_a/y/bak/bmc_upgrade root@$IP:~/myscpfunc $STRING} else {spawn scp $Local_File /home_a/y/bak/bmc_upgrade root@$IP:~/myscpfunc $STRING}
}if { [llength $argv] == 3} { set path [lindex $argv 2]spawn scp $Local_File root@$IP:$pathmyscpfunc $STRING
}

5.bmc_upgrade:断电重启才从主启,当前永远mtd4
if [ $# -lt 1 ];thenecho "Usage: `basename $0`+<1;2;all>"echo "1 : flash0"echo "2 : flash0ro"echo "all : flash0 & flash0ro"echo "ocp : update ocpbmc image"exit 255
fi
cat /proc/mtd |grep -i "flash0\""
cat /proc/mtd |grep -i "flash0ro"F0_string=$(cat /proc/mtd |grep -i flash0\" |cut -b 1-4)
F1_string=$(cat /proc/mtd |grep -i flash0ro |cut -b 1-4)
if [ "$F1_string" = "" ]; thenF1_string=$(cat /proc/mtd |grep -i flash1 |cut -b 1-4)
fiif [ $1 == "1" ]; thensource /usr/local/bin/openbmc-utils.shecho "Update /dev/$F0_string"flashcp ./flash-* /dev/$F0_string
elif [ $1 == "2" ]; thensource /usr/local/bin/openbmc-utils.shecho "Update /dev/$F1_string"flashcp ./flash-* /dev/$F1_string
elif [ $1 == "all" ]; thensource /usr/local/bin/openbmc-utils.shecho "Update /dev/$F0_string & /dev/$F1_string"echo "First : Update /dev/$F0_string"flashcp ./flash-* /dev/$F0_stringecho "Second : Update /dev/$F1_string"flashcp ./flash-* /dev/$F1_string
elif [ $1 == "ocp" ]; thenImage_ID=$(ls /tmp/images/)if [ ${#Image_ID} -eq 8 ];thenecho "IMAGE ID = ${Image_ID}"elseecho "IMAGE ID = ${Image_ID}"echo "Error-----multiple image"exit 255fiecho "busctl set-property xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/$Image_ID xyz.openbmc_project.Software.Activation RequestedActivation s xyz.openbmc_project.Software.Activation.RequestedActivations.Active"busctl set-property xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/$Image_ID xyz.openbmc_project.Software.Activation RequestedActivation s xyz.openbmc_project.Software.Activation.RequestedActivations.Activesleep 3echo "busctl get-property xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/$Image_ID xyz.openbmc_project.Software.Activation Activation" busctl get-property xyz.openbmc_project.Software.BMC.Updater /xyz/openbmc_project/software/$Image_ID xyz.openbmc_project.Software.Activation Activationsleep 1
fiif [ $? == "0" ];thenecho "Update Over"echo "reboot now !!!!"reboot
elseecho "Update fail !!!!"
fi
6.自动升级bmc:AC ON物理上电

#!/bin/sh
#shellcheck disable=SC1091
. /usr/local/bin/openbmc-utils.sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/binBMC_VERSION=/var/log/automatic_upgrade/version/bmc_version #主备版本都和这个比较,而不是主备互相比较
BMC_FW=/var/log/automatic_upgrade/fw/flash-xs9880-8c
BMC_WTD2_COUNT=/var/log/wtd_count
BMC_FW_UPDATE_COUNT=/var/log/bmc_update_count
FW_UPDATE_TIMES=8check_file_ok() {if [ ! -f "$BMC_WTD2_COUNT" ]; then #这行if是:假如不存在文件echo 0 > $BMC_WTD2_COUNT #创建文件并写0fiif [ ! -f "$BMC_FW_UPDATE_COUNT" ]; thenecho 0 > $BMC_FW_UPDATE_COUNTfiif [ ! -f "$BMC_VERSION" ] || [ ! -f "$BMC_FW" ]; thenecho "$BMC_VERSION or $BMC_FW file does not exist"exit 255fi
}check_fw_update_count() {bmc_fw_update_cont=$(cat "$BMC_FW_UPDATE_COUNT")if [ "$FW_UPDATE_TIMES" -lt "$bmc_fw_update_cont" ]; thenlogger -p user.err "$0 update bmc times exceeded"exit 255fi
}check_wtd2_count() {if [ "$wdt2_timeout_count" -eq 0 ]; thenecho 0 > $BMC_WTD2_COUNTfi
}#11111111111111111111111111111111111111111111111111111111111111111111111111111
update_bmc_fw() {if [ "$1" = "current" ]; thenflashcp $BMC_FW /dev/mtd4elif [ "$1" = "other" ]; thenflashcp $BMC_FW /dev/mtd9fi
}change_bmc_boot() {if [ "Master"x = "$bmc_boot"x ]; then bmc_boot_info.sh reset slaveelsebmc_boot_info.sh reset masterfi
}get_bmc_version() {if [ "$1" = "other" ]; thenbmc_version=$(version_dump --pingpong | awk -F ": " '{print $2}')elif [ "$1" = "current" ]; thenbmc_version=$(version_dump bmc | awk -F ": " '{print $2}')fiecho "$bmc_version"
}#1111111111111111111111111111111111111111111111111111111111111111111111111111111
update_bmc_fw_update_count() {index=$(cat "$BMC_FW_UPDATE_COUNT")index=$((index+1))echo $index > $BMC_FW_UPDATE_COUNT
}update_wdt2_timeout_count() {echo "$wdt2_timeout_count" > $BMC_WTD2_COUNT
}clean_bmc_fw_update_count() {echo 0 > $BMC_FW_UPDATE_COUNT
}#111111111111111111111111111111111111111111111111111111111111111111111111111111
main() {check_file_okbmc_boot_info=$(bmc_boot_info.sh)bmc_boot=$(echo $bmc_boot_info |awk -F " " '{print $10}')wdt2_timeout_count=$(echo $bmc_boot_info |awk -F " " '{print $4}')bmc_base_version=$(cat "$BMC_VERSION")bmc_wtd2_count=$(cat "$BMC_WTD2_COUNT")current_version=$(get_bmc_version current)other_version=$(get_bmc_version other)check_wtd2_countcheck_fw_update_countecho "$current_version" echo "$other_version"echo "$bmc_wtd2_count"echo "$wdt2_timeout_count"if [ "$bmc_wtd2_count"x = "$wdt2_timeout_count"x ]; then # N(No) WTD没有增加if [ "$bmc_base_version"x = "$current_version"x ]; then # 文件版本和当前版本一致if [ "$bmc_base_version"x = "$other_version"x ]; then # 文件版本和对面版本一致echo "all same"clean_bmc_fw_update_countelse # 文件版本和当前版本一致,但不和对面版本一致 【只有非当前版本一致】echo "only other not same"update_bmc_fw_update_countupdate_bmc_fw otherfielse # 文件版本和当前版本不一致if [ "$bmc_base_version"x = "$other_version"x ]; then # 【只有当前BMC版本不一致】echo "only current not same"change_bmc_bootelse # 【两块BMC版本都不一致】echo "all not same"update_bmc_fw_update_countupdate_bmc_fw otherchange_bmc_bootfifielse #Y WTD增加了update_wdt2_timeout_countif [ "$bmc_base_version"x = "$current_version"x ]; then #【当前BMC版本一致】echo "current same"update_bmc_fw_update_countupdate_bmc_fw otherelse # 【当前BMC版本不一致】echo "current not same"update_bmc_fw_update_countupdate_bmc_fw otherchange_bmc_bootfifi
}
main
相关文章:
【Shell1】shell语法,ssh/build/scp/upgrade,环境变量,自动升级bmc
文章目录1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&…...
JavaScript HTML DOM - 改变CSS
JavaScript 是一种动态语言,它可以动态地修改网页的外观,并且使用HTML DOM(文档对象模型)可以更方便地控制HTML元素的样式。 JavaScript 通过在HTML DOM中更改CSS属性来更改样式,这些CSS属性包括颜色、位置、字体大小…...
mycat连接mysql 简单配置
mycat三个配置文件位于conf下 可通过Notepad操作 首先配置service.xml中的user标签,设置用户名,密码,查询权限,是否只读等 只是设置了root用户,有所有权限 配置schema.xml <?xml version"1.0"?&g…...
Spring常用注解
文章目录一、Bean交给Spring管理1、Component2、Bean3、Controller4、Service5、Repository6、Configuration7、ComponentScan二、作用域1、Lazy(false)Scope三、依赖注入1、Autowired2、Resource3、Qualifier四、读取配置文件值1、Value一、Bean交给Spring管理 1、Component …...
I.MX6ULL内核开发9:kobject-驱动的基石
目录 一、摘要 二、重点 三、驱动结构模型 四、关键函数分析 kobject_create_and_add()函数 kobject_create()函数 kobject_init()函数 kobject_init_internal()函数 kobject_add()函数 kobject_add_varg&am…...
Docker-harbor私有仓库
一、Harbor概述 1、Harbor的概念 • Harbor是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务 • Harbor以 Docker 公司开源的Registry 为基础,提供了图形管理UI、基于角色的访问控制(Role Base…...
Java之动态规划之子序列问题
目录 0.动态规划问题 一.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 二.最长递增子序列 1.题目描述 2.问题分析 3.代码实现 三.最长重复子数组 1.题目描述 2.问题分析 3.代码实现 4.代码的优化(滚动数组) 四.最长公共子序列 1.题目描述 2.问题分析 3.代…...
java ArrayList
目录 一.简单介绍 二.ArrayList的底层结构 2.1ArrayList的底层结构和操作分析 2.ArrayList 底层源码分析 三.ArrayList 方法 四.代码使用方法 一.简单介绍 ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们…...
前端——周总结系列四
1 JS变量与常量 概述 变量:在后续编码过程中会被重新赋值,是不断变化的。常量:固定不变的数据,日常生活比如性别男,代码层面是在编码过程中不会变化的固定数据。 命名规则 变量 可以包含数字,字母&…...
Linux重定向符、管道符讲解
目录 重定向 将命令与文件进行互动 输出重定向 输入重定向 管道符 将命令与命令互动起来 重定向 将命令与文件进行互动 重定向分类 一般情况下,Linux命令运行时都会打开一下三个文件 标准输入文件:stdin文件,文件描述符为0,Li…...
【C++】多态
多态一、多态的概念及定义1.1 虚函数1.2 虚函数重写的特殊情况1.3 override 和 final二、抽象类2.1 概念2.2 用处三、多态的原理3.1 虚函数表3.1.1 虚函数与虚表的位置3.2 多态的原理3.3 静态绑定和动态绑定四、单/多继承的虚函数表4.1 单继承的虚函数表4.2 多继承的虚函数表一…...
分布式项目-品牌管理(5、6)
【今日成果】: //使用阿里云OSS服务: //使用v-if如果地址没有就不显示 , 如果地址错误图片就显示不出来; 【快速回顾】: 任何数据的删除都不要使用物理上的删除,应当使用逻辑上的删除!&…...
自定义ESLint规则开发与使用
自定义eslint及使用 项目结构 |-eslint-plugin-demo //自定义eslint插件项目 | |-demo-app // 使用自定义eslint的测试应用 |-README.md 项目效果: github项目地址 自定义ESLint环境准备 安装脚手架 执行下列命令来安装开发eslint的脚手架。 yo(y…...
【JavaScript】35_包装类与垃圾回收机制
10、包装类 在JS中,除了直接创建原始值外,也可以创建原始值的对象 通过 new String() 可以创建String类型的对象 通过 new Number() 可以创建Number类型的对象 通过 new Boolean() 可以创建Boolean类型的对象 但是千万不要这么做 包装类࿱…...
【CS224W】(task3)NetworkX工具包实践
note 节点可以为任意可哈希的对象,比如字符串、图像、XML对象,甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建:图为节点、文件为节点、函数为节点,等灵活的图形式。暂时省略:【B5】计算机网络图…...
ansible的模块详解
ansible 的概述 什么是ansible Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。 它用Python写成,类似于saltstack和Puppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。 它使用SSH来和节点进行通信。Ansible基于 Python…...
《Terraform 101 从入门到实践》 Functions函数
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 Terraform的函数 Terraform为了让大家在表达式上可以更加灵活方便地进行计算,提供了大量的内置函数…...
使用kubeadm快速部署一个K8s集群
wkubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口 >1. 安装要求 …...
初探富文本之CRDT协同算法
初探富文本之CRDT协同算法 CRDT的英文全称是Conflict-free Replicated Data Type,最初是由协同文本编辑和移动计算而发展的,现在还被用作在线聊天系统、音频分发平台等等。当前CRDT算法在富文本编辑器领域的协同依旧是典型的场景,常用于作为…...
Dubbo和Zookeeper集成分布式系统快速入门
文件结构 代码部分 1、新建provider-server导入pom依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</version></dependency><dependency>&l…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
