Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 连接后无法在主机上正确运行脚本_Linux_Shell_Ssh - Fatal编程技术网

Linux 连接后无法在主机上正确运行脚本

Linux 连接后无法在主机上正确运行脚本,linux,shell,ssh,Linux,Shell,Ssh,我不熟悉linux脚本。请帮忙。我在下面搜索了很多,但没有找到合适的答案: 我正在尝试制作一个脚本,稍后我会将其安排为cronjob,以便它在后端继续运行,并将结果存储在一个文件(比如test.txt)中 脚本的要点如下: 它通过ssh连接到主机,然后在该主机上运行一些命令并将结果保存在文件中。该脚本已成功连接到主机,但未在主机上自动运行命令。脚本如下: 所以我根据其中一个答案更新了我的脚本。。如下- #!/usr/bin/expect -f spawn ssh aspen expect "p

我不熟悉linux脚本。请帮忙。我在下面搜索了很多,但没有找到合适的答案:

我正在尝试制作一个脚本,稍后我会将其安排为cronjob,以便它在后端继续运行,并将结果存储在一个文件(比如test.txt)中

脚本的要点如下:

  • 它通过ssh连接到主机,然后在该主机上运行一些命令并将结果保存在文件中。该脚本已成功连接到主机,但未在主机上自动运行命令。脚本如下:
  • 所以我根据其中一个答案更新了我的脚本。。如下-

    #!/usr/bin/expect -f
    spawn ssh aspen
    expect "password: "    
    send "PASSWORD\r"    
    expect "$ "    
    send "/bin/sh /home/target/Script.sh >>test.txt"    
    expect "$ "    
    send "exit\r"
    

    但当我运行这个脚本时,它不会在test.txt上保存完整的输出。第二件事是,我希望这个输出文件在我自己的系统上,而不是在主机上。任何帮助都将非常有用。

    请不要将expect与ssh一起使用。尤其不要用它来提供密码

    #!/usr/bin/expect -f
    
    spawn ssh aspen
    
    expect "password: "
    
    send "PASSWORD\r"
    
    expect "$ "
    
    send "/bin/sh /home/target/Script.sh >>test.txt"
    
    expect "$ "
    
    send "exit\r"
    

    无论何时需要脚本化ssh会话,都应该使用。然后,您可以将命令直接发送到ssh的标准输入或作为参数传递。或者,更好的是,通过
    .ssh/authorized_keys
    中的
    命令
    选项在服务器上定义命令,这更安全,因为即使有人获得了密钥(不能用密码保护),他们也无法运行任何其他命令。

    请不要将expect与ssh一起使用。尤其不要用它来提供密码

    #!/usr/bin/expect -f
    
    if {[llength $argv] != 5} {
    
    puts "usage: ssh.exp username password server port program"
    
    exit 1
    
    }
    
    set username [lrange $argv 0 0]
    
    set password [lrange $argv 1 1]
    
    set server [lrange $argv 2 2]
    
    set port [lrange $argv 3 3]
    
    set program [lrange $argv 4 4]
    
    set timeout 60
    
    spawn ssh -p $port $username@$server $program
    
    match_max 100000
    
    expect "*?assword:*"
    
    send -- "$password\r"
    
    send -- "\r"
    
    expect eof
    
    无论何时需要脚本化ssh会话,都应该使用。然后,您可以将命令直接发送到ssh的标准输入或作为参数传递。或者,更好的是,通过
    .ssh/authorized_keys
    中的
    命令
    选项在服务器上定义命令,这更安全,因为即使有人获得了密钥(不能用密码保护),他们也无法运行任何其他命令

    #!/usr/bin/expect -f
    
    if {[llength $argv] != 5} {
    
    puts "usage: ssh.exp username password server port program"
    
    exit 1
    
    }
    
    set username [lrange $argv 0 0]
    
    set password [lrange $argv 1 1]
    
    set server [lrange $argv 2 2]
    
    set port [lrange $argv 3 3]
    
    set program [lrange $argv 4 4]
    
    set timeout 60
    
    spawn ssh -p $port $username@$server $program
    
    match_max 100000
    
    expect "*?assword:*"
    
    send -- "$password\r"
    
    send -- "\r"
    
    expect eof
    
    运行方式:

    ./ssh.exp root toor localhost 22  ./home/target/Script.sh >>test.txt
    
    运行方式:

    ./ssh.exp root toor localhost 22  ./home/target/Script.sh >>test.txt
    

    运行下面的脚本。它将以用户身份ssh到aspin
    user
    。整个ssh会话的输出(包括/home/target/Script.sh的输出)将附加到本地文件test.txt。此外,grep去掉了提示输入密码的内容

    #!/bin/bash
    
    {
    /usr/bin/expect  <<- EOF
        spawn ssh user@aspin "/home/target/Script.sh"
        expect "password:"
        send "PASSWORD\r"
        expect eof
    EOF
    } |grep -v  "user@apsin's password:">>  test.txt
    
    系统将提示您输入密码短语。如果您不想使用expect,可以使用空的密码短语。下一步是将公钥复制到user@aspin:~/.ssh/以便您可以使用私钥来证明自己

    $ ssh-copy-id  user@aspin
    
    您现在应该可以登录而无需询问密码。下面是您的本地脚本在使用基于rsa密钥的身份验证而不使用密码短语时的外观

    #!/bin/bash
    ssh user@aspin "/home/target/Script.sh" >>  test.txt
    

    有关expect和远程登录的更多信息,请查看:

    运行下面的脚本。它将以用户身份ssh到aspin
    user
    。整个ssh会话的输出(包括/home/target/Script.sh的输出)将附加到本地文件test.txt。此外,grep去掉了提示输入密码的内容

    #!/bin/bash
    
    {
    /usr/bin/expect  <<- EOF
        spawn ssh user@aspin "/home/target/Script.sh"
        expect "password:"
        send "PASSWORD\r"
        expect eof
    EOF
    } |grep -v  "user@apsin's password:">>  test.txt
    
    系统将提示您输入密码短语。如果您不想使用expect,可以使用空的密码短语。下一步是将公钥复制到user@aspin:~/.ssh/以便您可以使用私钥来证明自己

    $ ssh-copy-id  user@aspin
    
    您现在应该可以登录而无需询问密码。下面是您的本地脚本在使用基于rsa密钥的身份验证而不使用密码短语时的外观

    #!/bin/bash
    ssh user@aspin "/home/target/Script.sh" >>  test.txt
    

    有关expect和远程登录的更多信息,请查看:

    我认为您需要删除“interact”并只发送剩余的命令。我认为您需要删除“interact”并只发送剩余的命令。谢谢!它起作用了。但我仍然有一些问题。1.)它不会在test.txt上保存完整的输出2.)这个test.txt是在主机上生成的&我希望它在我自己的系统上。。请帮忙@普拉尚特:把重定向移到外面就行了。但整个事情都错了。Ssh不接受来自脚本的密码,以阻止在脚本中存储密码的不安全做法。别这么做,唐克斯!它起作用了。但我仍然有一些问题。1.)它不会在test.txt上保存完整的输出2.)这个test.txt是在主机上生成的&我希望它在我自己的系统上。。请帮忙@普拉尚特:把重定向移到外面就行了。但整个事情都错了。Ssh不接受来自脚本的密码,以阻止在脚本中存储密码的不安全做法。不要这样做。我经常想知道密码短语的好处。如果您使用一个,那么您的自动远程登录脚本需要使用expect。而且,如果攻击者可以读取您的~/.ssh/id_rsa私钥,他们可以读取您的expect脚本,或者可能安装密钥笔划记录器。@KeithReynolds:ssh不接受脚本中的密码或密钥密码短语。脚本应该使用单一用途的无密码密钥,最好限制在服务器端(通常通过命令)。密码短语适用于交互使用的密钥,其中公钥身份验证仍然比密码身份验证更安全。Expect是其自身有限的脚本语言。关于使用密码短语或密码,请注意,我说过“如果您使用密码短语或密码短语,那么您的自动远程登录脚本需要使用expect。”因此,如果您需要使用ssh和密码短语编写远程登录脚本,隐式的是ssh不接受来自bash的密码短语或密码。我经常想知道密码短语的好处。如果您使用一个,那么您的自动远程登录脚本需要使用expect。而且,如果攻击者可以读取您的~/.ssh/id_rsa私钥,他们可以读取您的expect脚本,或者可能安装密钥笔划记录器。@KeithReynolds:ssh不接受脚本中的密码或密钥密码短语。脚本应该使用单一用途的无密码密钥,最好限制在服务器端(通常通过命令)。密码短语适用于交互使用的密钥,在这种情况下,公钥身份验证仍然是安全的