- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
因此,Cisco 的正则表达式允许使用问号字符。但要注意的是,您必须在输入问号之前使用 Ctrl-Shift-v
才能将其解释为问号而不是帮助命令... Link to Cisco regex guidelines
我有一个 Go 程序可以登录一组设备并在每台设备上运行一组命令。但是,当尝试使用包含问号的正则表达式时,Cisco 设备始终将问号解释为帮助命令。在 Go 中使用字符串文字并不能解决问题,也不能将命令作为 byte slice 段发送。
例如,如果我尝试发送命令 show boot | include (c|cat)[0-9]+[a-zA-Z]?
Cisco CLI 返回
switch-1#show boot | include (c|cat)[0-9]+[a-zA-Z]?
LINE <cr>
switch-1#
而不是将问号解释为 [a-zA-Z] 组的 0 或 1 的正则表达式匹配。
但是,使用命令 ssh user@switch-1 'show boot | include (c|cat)[0-9]+[a-zA-Z]?'
按预期工作并正确解释正则表达式模式。
如何复制 ssh 命令的行为?有没有办法在每个问号之前发送 Ctrl-Shift-v
或转义每个问号字符?
我要求的代码:
package main
import (
"golang.org/x/crypto/ssh"
"net"
"fmt"
"os"
"bufio"
"time"
"golang.org/x/crypto/ssh/terminal"
"io"
"io/ioutil"
"sync"
"strings"
)
// ReadLines reads a file line-by-line and returns a slice of the lines.
func ReadLines(filename string) ([]string, error) {
f, err := os.Open(filename)
if err != nil {
return nil, fmt.Errorf("failed to open file: %v", err)
}
defer f.Close()
var lines []string
s := bufio.NewScanner(f)
for s.Scan() {
lines = append(lines, s.Text())
}
if err := s.Err(); err != nil {
return nil, err
}
return lines, nil
}
// Type Result represents the result of running the Configure method.
type Result struct {
Host string // Hostname of device
Output []byte // Remote shell's stdin and stderr output
Err error // Remote shell errors
}
// Configure logs into a device, starts a remote shell, runs the set of
// commands, and waits for the remote shell to return or timeout.
func Configure(host string, config *ssh.ClientConfig, cmds []string, results chan<- *Result, wg *sync.WaitGroup) {
defer wg.Done()
res := &Result{
Host: host,
Output: nil,
Err: nil,
}
// Create client connection
client, err := ssh.Dial("tcp", net.JoinHostPort(host, "22"), config)
if err != nil {
res.Err = fmt.Errorf("failed to dial: %v", err)
results <- res
return
}
defer client.Close()
// Create new session
session, err := client.NewSession()
if err != nil {
res.Err = fmt.Errorf("failed to create session: %v", err)
results <- res
return
}
defer session.Close()
// Set session IO
stdin, err := session.StdinPipe()
if err != nil {
res.Err = fmt.Errorf("failed to create pipe to stdin: %v", err)
results <- res
return
}
defer stdin.Close()
stdout, err := session.StdoutPipe()
if err != nil {
res.Err = fmt.Errorf("failed to create pipe to stdout: %v", err)
results <- res
return
}
stderr, err := session.StderrPipe()
if err != nil {
res.Err = fmt.Errorf("failed to create pipe to stderr: %v", err)
results <- res
return
}
// Start remote shell
if err := session.RequestPty("vt100", 0, 0, ssh.TerminalModes{
ssh.ECHO: 0,
ssh.TTY_OP_ISPEED: 14400,
ssh.TTY_OP_OSPEED: 14400,
}); err != nil {
res.Err = fmt.Errorf("failed to request pseudoterminal: %v", err)
results <- res
return
}
if err := session.Shell(); err != nil {
res.Err = fmt.Errorf("failed to start remote shell: %v", err)
results <- res
return
}
// Run commands
for _, cmd := range cmds {
if _, err := io.WriteString(stdin, cmd+"\n"); err != nil {
res.Err = fmt.Errorf("failed to run: %v", err)
results <- res
return
}
}
// Wait for remote commands to return or timeout
exit := make(chan error, 1)
go func(exit chan<- error) {
exit <- session.Wait()
}(exit)
timeout := time.After(1 * time.Minute)
select {
case <-exit:
output, err := ioutil.ReadAll(io.MultiReader(stdout, stderr))
if err != nil {
res.Err = fmt.Errorf("failed to read output: %v", err)
results <- res
return
}
res.Output = output
results <- res
return
case <-timeout:
res.Err = fmt.Errorf("session timed out")
results <- res
return
}
}
func main() {
hosts, err := ReadLines(os.Args[1])
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
cmds, err := ReadLines(os.Args[2])
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
fmt.Fprint(os.Stderr, "Password: ")
secret, err := terminal.ReadPassword(int(os.Stdin.Fd()))
if err != nil {
fmt.Fprintf(os.Stderr, "failed to read password: %v\n", err)
os.Exit(1)
}
fmt.Fprintln(os.Stderr)
config := &ssh.ClientConfig{
User: "user",
Auth: []ssh.AuthMethod{ssh.Password(string(secret))},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: 30 * time.Second,
}
config.SetDefaults()
config.Ciphers = append(config.Ciphers, "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc")
results := make(chan *Result, len(hosts))
var wg sync.WaitGroup
wg.Add(len(hosts))
for _, host := range hosts {
go Configure(host, config, cmds, results, &wg)
}
wg.Wait()
close(results)
for res := range results {
if res.Err != nil {
fmt.Fprintf(os.Stderr, "Error %s: %v\n", res.Host, res.Err)
continue
}
fmt.Printf("Host %s\n%s\n%s\n", res.Host, res.Output, strings.Repeat("-", 50))
}
}
最佳答案
尝试强制 IOS 终端服务器进入行模式(与字符模式相反)。发送这些 telnet 协商序列:
IAC DONT ECHO
IAC WONT ECHO
IAC DONT SUPPRESS-GO-AHEAD
IAC WONT SUPPRESS-GO-AHEAD
关于regex - Cisco Regex 的 Golang 转义问号字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50975209/
这个问题在这里已经有了答案: When to use generic methods and when to use wild-card? (9 个回答) 关闭 4 年前。 我试图理解为什么我们需要
我试图编写一个简单的 C 程序来检查路径名是否具有“.jpg”或“.jpeg”后缀。这是我的程序: #include #include #include regex_t regex; stati
我需要使用以下 URL 重定向传入请求: http://mywebsite.com/abc/mapserv.exe?map=123 到 http://mywebsite.com/abc/mapserv
当从我的应用程序插入一些中文字符时,它们会被写入数据库为“???”。不用说,在内置的命令行 mysql 客户端中一切都可以正常工作。 连接字符串: --user-db-uri = jdbc:mysql
您如何定义验证方法?例子:包括?甚至?奇怪? >> 2.odd? => false >> 6.even? => true >> 最佳答案 与您定义任何其他函数的方式相同 - 问号是函数名称的一部分:
我有一个字符串 $name = "name1?name2?name3?name4"; 我想修改这个变量为 $name2 = "name1/name2/name3/name4"; 使用 PHP preg
我已经搜索了对此的一种解释,但没有找到一种解释。在Prolog谓词的描述中,有时在变量名之前的问号,加号和减号是什么意思? 例: predicate(?Variable1,+Variable2,-Va
在Kotlin中,如果我们将类成员声明为 var 和 nullable 类型,则编译器不允许我们运行成员函数,尽管我们在调用函数之前放置了if语句,因为编译器无法保证该成员在针对null进行检查之后并
我想使用 JDBC 向表中插入一行。但是表有大量列,所以我不想将所有列指定到语句中。还有另一种指定列值的方法吗? INSERT INTO TABLE_NAME VALUES(?, ?, ?, ...,
这是我的应用程序崩溃时看到的(没有明显的原因,有时在启动时,有时在以后)。 我该怎么办? 最佳答案 在文件的两个版本中都更改了一行代码的差异被视为冲突,并且其指示符是一个问号。您必须指定解决所有冲突的
我正在尝试在 SpringData native 查询中使用 Postgres jsonb 字符串存在运算符。 SpringData 方法示例: @Query(value = "SELECT t.id
我从另一个应用程序传递了以下字符串。 2�4�9� (2�4�9�) 我想从上面的字符串中删除问号 ascii 字符。 我该怎么做? 最佳答案 根据这个Uni
我在 Android Activity 的 TextView 中遇到重音字符问题。渲染显示问号而不是字符“è”和“à”。流程是:从网络资源中获取一个 midi 文件 --> 提取歌词 --> 将歌词放
有什么办法可以防止'?'在 HTML/CSS 中被视为空白?这是默认行为,还是我做错了什么? 我有一个包含很长 URL 的 div(长度是动态的)。我希望 URL 将问号视为任何其他字符,而不是在该字
我见过这样的代码片段: export interface IUser { email?: string; firstName?: string; lastName?: stri
我正在从我的数据库中获取包含希伯来语单词的数据。然后我从 ResultSet 中获取这些数据并将其放入一个字符串中,然后将其放入一个 JSONObject 中。 代码如下: response.setC
这个问题在这里已经有了答案: What is an optional value in Swift? (15 个答案) 关闭 8 年前。 在 Swift 编程中,我发现了一些带有对象的问号。 var
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: Save Data in Arabic in MySQL database 我在使用 PHP 从 MYSQL 数
所以我在想,为了在控制台应用程序中实现这样的功能,在函数名称末尾附加一个问号将倒出它的文档字符串,我可能会使用像元类这样的功能,其中在定义/导入时,我将复制所有模块成员名称并生成新的名称,仅用于输入文
我有一个带有一堆标志(静态图像)的表单,每个标志下方都有一个勾选框。用户选择复选框以允许他们使用特定语言。在设计时,我为每种语言设置了对应的本地化复选框标题,在此示例中为“Español”(西类牙语)
我是一名优秀的程序员,十分优秀!