Falco安全项目扩展输出与自定义规则_falco 修改rulesfiles-程序员宅基地

技术标签: 安全  falco  falcon  

Falco扩展输出与自定义规则

Falco以及Falcosidekick输出类型汇总

默认情况下,Falco的事件有5个输出:stdout、file、GRPC、shell和http。如下图所示:

在这里插入图片描述

即使它们很方便,我们也可能很快被限制到只能将Falco与其他组件集成在一起。falcosidekick可以来帮忙。这是一个小守护进程,它扩展了可能的输出。

在这里插入图片描述

当前可用的falcosidekick输出列表(版本2.24.0)为:

Chat

Metrics / Observability

Alerting

Logs

Object Storage

FaaS / Serverless

Message queue / Streaming

Email

  • SMTP

Web

  • Webhook
  • WebUI (a Web UI for displaying latest events in real time)

部署Falco

在本文中,我们将在Slack频道以及对WebUI发送事件,因此先获取你的WebHook URL(https://…)。 在此之前先对falco进行安装(使用helm3)

1. 在Helm中添加falcosecurity仓库**

$ helm repo add falcosecurity https://falcosecurity.github.io/charts
 
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "falcosecurity" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!

2. 安装chart

$ helm install falco falcosecurity/falco --set falco.jsonOutput=true --set falco.httpOutput.enabled=true  --set falco.httpOutput.url=http://falcosidekick:2801 -f howto/falcoCustomRule.yaml -n falco

NAME: falco
LAST DEPLOYED: Mon Nov 9 22:09:28 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Falco agents are spinning up on each node in your cluster. After a few
seconds, they are going to start monitoring your containers looking for
security issues.
No further action should be required.

#这里的falcoCustomRule.yaml为自定义规则文件

3. 几秒钟后Falco应该开始运行,验证一下,你马上就会看到你创建的pod。

$ helm ls
$ kubectl get pods

部署Falcosidekick

1.helm安装falcosidekick

$helm install falcosidekick falcosecurity/falcosidekick --set config.slack.webhookurl=https://hooks.slack.com/services/xxxxxxxx  --set webui.enabled=true  -n falco

#输出
NAME: falcosidekick
LAST DEPLOYED: Thu Jan 14 23:55:12 2021
NAMESPACE: falco
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace falco -l "app.kubernetes.io/name=falcosidekick,app.kubernetes.io/instance=falcosidekick" -o jsonpath="{.items[0].metadata.name}")
  kubectl port-forward $POD_NAME 2801:2801
  echo "Visit http://127.0.0.1:2801 to use your application"
  
#关于hooks连接需要自主创建 https://slack.com/intl/zh-cn/

查看pod

$ kubectl get pod -n falco
NAME                                READY   STATUS    RESTARTS   AGE
falco-9hftg                         1/1     Running   0          89m
falco-gr5q7                         1/1     Running   1          90m
falco-lpczj                         1/1     Running   0          90m
falcosidekick-586bdb8c6b-j2wdf      1/1     Running   0          5h39m
falcosidekick-586bdb8c6b-zncvq      1/1     Running   0          5h39m
falcosidekick-ui-68f9444cbc-8x9b6   1/1     Running   0          40m

查看日志

$kubectl logs deployment/falcosidekick -n falco
Found 2 pods, using pod/falcosidekick-586bdb8c6b-j2wdf
2021/12/30 03:42:06 [INFO]  : Enabled Outputs : [Slack WebUI]
2021/12/30 03:42:06 [INFO]  : Falco Sidekick is up and listening on :2801
2021/12/30 03:48:12 [INFO]  : WebUI - Post OK (200)
2021/12/30 03:48:15 [INFO]  : Slack - Post OK (200)

修改falcosidekick的svc类型

#查看svc
$kubectl get svc -n falco
NAME               TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
falcosidekick      ClusterIP  10.106.191.244   <none>        2801/TCP        5h46m
falcosidekick-ui   ClusterIP  10.99.191.73     <none>        2802/TCP        5h46m

#修改svc类型
$kubectl  edit svc -n falco falcosidekick-ui
.......
spec:
  clusterIP: 10.99.191.73
  externalTrafficPolicy: Cluster
  ports:
  - name: http
    nodePort: 30802 #添加NodePort端口,端口范围30000-32767
    port: 2802
    protocol: TCP
    targetPort: http
  selector:
    app.kubernetes.io/instance: falcosidekick-ui
    app.kubernetes.io/name: falcosidekick-ui
  sessionAffinity: None
  type: NodePort #改为NodePort类型
.......

#查看svc
$ kubectl get svc -n falco
NAME               TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
falcosidekick      NodePort   10.106.191.244   <none>        2801:30801/TCP   5h46m
falcosidekick-ui   NodePort   10.99.191.73     <none>        2802:30802/TCP   5h46m

登录WebUI查看

在这里插入图片描述

登录slack查看输出

在这里插入图片描述

自定义规则

一、规则简介

Falco 规则文件是YAML 文件,包含三种类型元素 :

元素 描述
Rules 生成警报的触发条件。 带有描述信息的规则和警报被一起发送
Macros 在规则甚至其他宏中可重用的规则条件片段。宏提供了一种方法来命名常见模式和排除规则中的冗余。
Lists 可以包含在规则、宏或其他列表中的项目集合。与规则和宏不同,列表不能被解析为过滤表达式

二、Rules规则

Falco 规则包含以下键:

Key Required Description Default
rule yes 简短唯一的规则名称
condition yes 检测事件与规则是否匹配的过滤表达式
desc yes 规则检测内容的详细描述
output yes 事件匹配时输出的消息,遵循 Sysdig 输出格式语法
priority yes 事件严重性的表示(不区分大小写)。应该是以下之一:emergency、alert、critical、error、warning、notice、informational、debug。
exceptions no 导致规则不生成警报的一组异常
enabled no 如果设置为 false,则规则既不加载也不匹配任何事件。 true
tags no 应用于规则的标签列表
warn_evttypes no 如果设置为 false,Falco 会禁止和事件无关的规则相关的警告 true
skip-if-unknown-filter no 如果设置为 true,如果规则条件包含过滤检查项,例如fd.some_new_field,而这个版本的Falco不识别此项,Falco默默的接受了规则但不执行;如果设置为 false,Falco 会遇到未知过滤检查项时报告错误。 false
2.1 Conditions条件

规则的核心部分是条件字段。任何 Sysdig 过滤器都是有效的 Falco 条件。此外,Falco 条件可以包含Macros宏。

每当 bash shell 在容器内运行时发出警报的条件示例:

container.id != host and proc.name = bash

第一个子句检查事件是否发生在容器中(如果事件发生在常规主机上,Sysdig 事件的container字段等于“host”)。

第二个子句检查进程名称是否为 bash。

请注意,此条件不包括带有系统调用的子句!它只检查事件元数据。

因此,如果 bash shell 确实在容器中启动,Falco 会为该 shell 执行的每个系统调用输出事件。

使用上述条件的完整规则可能是:

- rule: shell_in_container  #规则名称
  desc: notice shell activity within a container  #规则注释
  condition: container.id != host and proc.name = bash #条件过滤表达式(非常规主机下使用bash)
  output: shell in a container (user=%user.name container_id=%container.id  container_name=%container.name shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
  #匹配时输出信息
  priority: WARNING #事件等级
2.2 Macros宏

举一个非常简单的例子,如果我们有很多规则涉及到容器中发生的事件,我们可能会定义一个 in_container 宏:

- macro: in_container #宏名称
  condition: container.id != host and proc.name = bash #条件过滤表达式

定义了这个宏之后,我们就可以将上述规则的条件重写为 in_container 和 proc.name = bash。

有关规则和宏的更多示例,请查看有关默认宏的文档或 rules/falco_rules.yaml 文件。

使用Macros宏的完整规则:

- rule: shell_in_container  #规则名称
  desc: notice shell activity within a container  #规则注释
  condition: (in_container) #条件过滤表达式(非常规主机下使用bash)
  output: shell in a container (user=%user.name container_id=%container.id  container_name=%container.name shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
  #匹配时输出信息
  priority: WARNING #事件等级
2.3 Lists列表

列表是可以包含在规则、宏甚至其他列表中的已命名项目集合。请注意,列表不能被解析为过滤表达式。每个列表节点都有以下键:

Key Description
list 列表的唯一名称
items 值列表

列表示例以及使用它的宏:

- list: shell_binaries  #列表名
  items: [bash, csh, ksh, sh, tcsh, zsh, dash] #包含值

- list: userexec_binaries
  items: [sudo, su]

- list: known_binaries
  items: [shell_binaries, userexec_binaries] #包含其他列表

- macro: safe_procs
  condition: proc.name in (known_binaries) #条件(进程名为列表包含值)

引用列表会在宏、规则或Lists列表中插入列表项。

三、附加到列表、规则和宏

如果您使用多个 Falco 规则文件,可能希望将新item附加到现有列表、规则或宏中。为此,请定义一个与现有item同名的item,并将 append: true 属性添加到列表中。

附加Lists列表时,item被添加到List列表的末尾。

附加规则/宏时,附加文本将附加到条件:规则/宏的字段。

附加规则也可以在使用Helm Chart部署时添加配置规则文件

$ helm install falco falcosecurity/falco -f falcoCustomRule.yaml -n falco

falcoCustomRule.yaml

customRules:
  falco_custom_network_rule.yaml: |-
    - list: website_ips
      items: ['"197.255.20.45"']
    
    - rule: Connection to test or releaes
      desc: Detect attempts to connect to yjp  website  
      condition: outbound and fd.sip in (website_ips)
      output: Outbound connection to yjp website http://www.release.yijiupidev.com or http://www.test.yijiupidev.com/(command=%proc.cmdline connection=%fd.name container_id=%container.id container_name=%container.name %container.info image=%container.image)
      priority: WARNING
      tags: [network]

请注意,在附加到列表、规则或宏时,规则配置文件的顺序很重要!

例如,如果您附加到现有的默认规则,您必须确保您的自定义配置文件(例如 /etc/falco/rules.d/custom-rules.yaml)在默认配置文件(/etc/falco/falco_rules.yaml)之后加载。

三种方式来实现配置文件加载顺序:

  1. 可通过以正确的顺序使用多个 -r 参数来进行配置(本地安装)
  2. 通过 falco 配置文件 (falco.yaml) 中的rules_file
  3. 使用官方 Helm Chart的 falco.rulesFile 值
3.0 示例(本地安装)
falco -r /etc/falco/falco_rules.yaml -r /etc/falco/falco_rules.local.yaml
3.1 附加到列表

附加到列表的示例:

/etc/falco/falco_rules.yaml

- list: my_programs
  items: [ls, cat, pwd]

- rule: my_programs_opened_file
  desc: track whenever a set of programs opens a file
  condition: proc.name in (my_programs) and evt.type=open
  output: a tracked program opened a file (user=%user.name command=%proc.cmdline file=%fd.name)
  priority: INFO

/etc/falco/falco_rules.local.yaml

- list: my_programs #附加至my_programs列表名
  append: true
  items: [cp]

当 ls、cat、pwd 或 cp 打开文件时,my_programs_opened_file 规则都会触发。

3.2 附加到宏

附加到宏示例:

/etc/falco/falco_rules.yaml

- macro: access_file
  condition: evt.type=open

- rule: program_accesses_file
  desc: track whenever a set of programs opens a file
  condition: proc.name in (cat, ls) and (access_file)
  output: a tracked program opened a file (user=%user.name command=%proc.cmdline file=%fd.name)
  priority: INFO

/etc/falco/falco_rules.local.yaml

- macro: access_file #宏名称
  append: true
  condition: or evt.type=openat  #附加规则条件

规则 program_accesses_file 将在 ls/cat 对文件使用 open/openat 时触发

3.3 附加到规则

附加到规则示例:

/etc/falco/falco_rules.yaml

- rule: program_accesses_file
  desc: track whenever a set of programs opens a file
  condition: proc.name in (cat, ls) and evt.type=open
  output: a tracked program opened a file (user=%user.name command=%proc.cmdline file=%fd.name)
  priority: INFO

/etc/falco/falco_rules.local.yaml

- rule: program_accesses_file #规则名称
  append: true
  condition: and not user.name=root #附加条件(user.name为root不触发)

规则 program_accesses_file 将在 ls/cat 对文件使用 open 时触发,但如果用户是 root 则不会触发。

3.4 规则/宏附加和逻辑运算符的问题

请记住,在附加规则和宏时,第二个规则/宏的文本只是添加到第一个规则/宏的条件中。

如果原始规则/宏具有模糊不明确的逻辑运算符,这可能会导致意外结果。下面是一个例子:

- rule: my_rule
  desc: ...
  condition: evt.type=open and proc.name=apache
  output: ...

- rule: my_rule
  append: true
  condition: or proc.name=nginx

有两种解释

解释1: apache/nginx 打开文件或者 evt.type=open操作?

解释2:apache打开文件或者允许nginx做任何事情?

在这种情况下,可用括号限定原始条件的逻辑运算符的范围,或者避免附加条件(如果无法添加的话)。

四、禁用默认规则

尽管 Falco 提供了非常强大的默认规则集,但您有时需要禁用其中一些默认规则,因为它们在您的环境中无法正常工作。幸运的是 Falco 为您提供了选择:

4.1 通过现有的宏

大多数默认规则都提供了一些consider_ 宏。这些 consider_ 宏通常设置为 (never_true) 或 (always_true),用于启用或禁用相关规则。

现在,如果您想启用一个默认禁用的规则(例如意外出站连接目的地),您只需在自定义 Falco 配置中覆盖规则的 consider_* 宏(在本例中为 consider_all_outbound_conns)。

您的自定义 Falco 配置示例(注意 (always_true) 条件):

- macro: consider_all_outbound_conns
  condition: (always_true)

请再次注意,指定配置文件的顺序很重要!最后定义的同名宏获胜。

4.2 通过 Falco 参数

Falco 提供以下参数来限制哪些默认规则可启用或使用,哪些不可以:

-D <substring>                Disable any rules with names having the substring <substring>. Can be specified multiple times.

-T <tag>                      Disable any rules with a tag=<tag>. Can be specified multiple times.
                               Can not be specified with -t.

-t <tag>                      Only run those rules with a tag=<tag>. Can be specified multiple times.
                               Can not be specified with -T/-D.

如果您通过官方 Helm Chart部署 Falco,也可以将这些参数指定为 Helm Chart值 (extraArgs)。

4.3 通过自定义规则

您可以使用 append: true 和 enabled: false 属性的组合来禁用本来默认启用的规则。这对于在默认条件下不提供 consider_* 宏的规则特别有用

确保自定义配置文件在默认配置文件之后加载。可使用多个 -r 参数来确保正确顺序(本地安装),也可在 falco 配置文件 falco.yaml 中通过 rules_file确保正确顺序。如果您使用的是官方 Helm Chart,请使用 falco.rulesFile 值配置正确的顺序。

例如,要禁用 /etc/falco/falco_rules.yaml 中的 User mgmt binaries默认规则,请在 /etc/falco/rules.d/custom-rules.yaml 中定义自定义规则:

- rule: User mgmt binaries
  append: true
  enabled: false

备注:

#我们正在调查此功能似乎存在错误。如果启用:false 不起作用,您可以使用以下解决方法作为替代:

- rule: User mgmt binaries
  condition: and (never_true)
  append: true

五、规则优先级

每个 Falco 规则都有一个优先级,表明违反规则的严重程度。优先级包含在message/JSON output等中。以下是可用的优先级:

  • EMERGENCY
  • ALERT
  • CRITICAL
  • ERROR
  • WARNING
  • NOTICE
  • INFORMATIONAL
  • DEBUG

规则优先级的分配准则如下:

  • 如果规则与写入状态(即文件系统等)有关,则其优先级为 ERROR。
  • 如果规则与未经授权的读取状态(即读取敏感文件等)有关,则其优先级为 WARNING。
  • 如果规则与意外行为(在容器中产生意外的 shell、打开意外的网络连接等)有关,则其优先级为 NOTICE。
  • 如果规则与违反最佳实践的行为有关(意外的特权容器、具有敏感挂载的容器、以 root 身份运行交互式命令),则其优先级为 INFO。
  • 一个例外是规则“Run shell untrusted”,它有FP-prone,优先级为 DEBUG

六、规则标签

从 0.6.0 开始,规则有一组可选的标签,用于将规则集分类为相关规则组。下面是一个例子:

- rule: File Open by Privileged Container
  desc: Any open by a privileged container. Exceptions are made for known trusted images.
  condition: (open_read or open_write) and container and container.privileged=true and not trusted_containers
  output: File opened for read/write by privileged container (user=%user.name command=%proc.cmdline %container.info file=%fd.name)
  priority: WARNING
  tags: [container, cis]

在这种情况下,规则“File Open by Privileged Container”被赋予了标签“container”和“cis”。如果给定规则的标签键不存在或列表为空,则规则没有标签。

以下是使用标签的方法: (本地安装)

  • 您可以使用 -T 参数禁用具有给定标签的规则。 -T 可以指定多次。

例如要跳过所有带有“filesystem”和“cis”标签的规则,你可以使用 falco -T filesystem -T cis .... 。-T 不能与 -t 一起指定。

  • 您可以使用 -t 参数仅仅运行具有给定标记的规则。 -t 可以指定多次。

例如,要仅运行带有“filesystem”和“cis”标签的规则,您可以使用 falco -t filesystem -t cis .... 。-t 不能与 -T 或 -D 一起指定(通过规则名称正则表达式禁用规则)。

6.1 当前 Falco 规则集的标签

我们还检查了默认规则集,并用一组初始标签标记了所有规则。以下是我们使用过的标签:

Tag Description
filesystem 该规则与读/写文件有关
software_mgmt 该规则与任何软件/包管理工具有关,如 rpm、dpkg 等。
process 该规则与启动新进程或更改当前进程的状态有关
database 该规则与数据库相关
host 该规则仅适用于容器之外
shell 该规则特别和启动 shell有关
container 该规则仅适用于容器之内
cis 该规则与 CIS Docker 基准相关
users 该规则与用户管理或更改正在运行的进程的身份有关
network 该规则与网络活动有关

如果规则与上述多项相关,则规则可以有多个标签。目前falco 规则集中的每个规则至少有一个标签

七、规则条件最佳实践

为了允许按事件类型对规则进行分组以提高性能,Falco 更倾向于在任何负运算符(即 not 或 !=)之前,在condition条件的开头至少有一个 evt.type= 运算符。如果condition 条件没有任何 evt.type= 运算符,Falco 会记录如下警告:

Rule no_evttype: warning (no-evttype):
proc.name=foo
     did not contain any evt.type restriction, meaning that it will run for all event types.
     This has a significant performance penalty. Consider adding an evt.type restriction if possible.

如果规则在条件的后半部分有 evt.type 运算符,Falco 会记录如下警告:

Rule evttype_not_equals: warning (trailing-evttype):
evt.type!=execve
     does not have all evt.type restrictions at the beginning of the condition,
     or uses a negative match (i.e. "not"/"!=") for some evt.type restriction.
     This has a performance penalty, as the rule can not be limited to specific event types.
     Consider moving all evt.type restrictions to the beginning of the rule and/or
     replacing negative matches with positive matches if possible.

八、转义特殊字符

在某些情况下,规则可能需要包含特殊字符,如 (、空格等。例如,您可能需要查找 (systemd) 的 proc.name,包括周围的括号。

Falco 与 Sysdig 一样,允许您使用 " 来捕获这些特殊字符。这是一个示例

- rule: Any Open Activity by Systemd
  desc: Detects all open events by systemd.
  condition: evt.type=open and proc.name="(systemd)" or proc.name=systemd
  output: "File opened by systemd (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING

在列表中包含item项目时,通过用单引号将带引号的字符串括起来,确保不会从 YAML 文件中解释双引号。下面是一个例子:

- list: systemd_procs
  items: [systemd, '"(systemd)"']

- rule: Any Open Activity by Systemd
  desc: Detects all open events by systemd.
  condition: evt.type=open and proc.name in (systemd_procs)
  output: "File opened by systemd (user=%user.name command=%proc.cmdline file=%fd.name)"
  priority: WARNING

仔细看上述的第二行,items: [systemd, ‘"(systemd)"’],其中’"(systemd)"'是用单引号引用的。

九、忽略的系统调用

出于性能原因,一些系统调用目前在 Falco 处理它们之前被丢弃。这是列表:

access alarm brk capget clock_getres clock_gettime clock_nanosleep clock_settime close container cpu_hotplug drop epoll_create epoll_create1 epoll_ctl epoll_pwait epoll_wait eventfd eventfd2 exit_group fcntl fcntl64 fdatasync fgetxattr flistxattr fstat fstat64 fstatat64 fstatfs fstatfs64 fsync futex get_robust_list get_thread_area getcpu getcwd getdents getdents64 getegid geteuid getgid getgroups getitimer getpeername getpgid getpgrp getpid getppid getpriority getresgid getresuid getrlimit getrusage getsid getsockname getsockopt gettid gettimeofday getuid getxattr infra io_cancel io_destroy io_getevents io_setup io_submit ioprio_get ioprio_set k8s lgetxattr listxattr llistxattr llseek lseek lstat lstat64 madvise mesos mincore mlock mlockall mmap mmap2 mprotect mq_getsetattr mq_notify mq_timedreceive mq_timedsend mremap msgget msgrcv msgsnd munlock munlockall munmap nanosleep newfstatat newselect notification olduname page_fault pause poll ppoll pread pread64 preadv procinfo pselect6 pwrite pwrite64 pwritev read readv recv recvmmsg remap_file_pages rt_sigaction rt_sigpending rt_sigprocmask rt_sigsuspend rt_sigtimedwait sched_get_priority_max sched_get_priority_min sched_getaffinity sched_getparam sched_getscheduler sched_yield select semctl semget semop send sendfile sendfile64 sendmmsg setitimer setresgid setrlimit settimeofday sgetmask shutdown signaldeliver signalfd signalfd4 sigpending sigprocmask sigreturn splice stat stat64 statfs statfs64 switch sysdigevent tee time timer_create timer_delete timer_getoverrun timer_gettime timer_settime timerfd_create timerfd_gettime timerfd_settime times ugetrlimit umask uname ustat vmsplice wait4 waitid waitpid write writev

当使用 -i 运行时,Falco 打印忽略的事件/系统调用 集合并退出。

如果您想针对所有事件运行 Falco,包括上面列表中的系统调用,您可以使用 -A 标志来运行 Falco。

参考文档:
https://github.com/falcosecurity/falco
https://github.com/falcosecurity/falcosidekick

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wsq0713/article/details/122494778

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签