Answers:
您是否考虑过使用无密码的sudo?
您所描述的内容可能会与Expect一起使用。
您可以将命令作为参数传递给SSH,以仅在服务器上运行该命令,然后退出:
ssh user@host "command to run"
这也适用于多个命令的列表:
ssh user@host "command1; command2; command3"
或者:
ssh user@host "
command1
command2
command3
"
正如其他用户在我之前指出的那样,su
在服务器上运行将启动新的Shell,而不是以root身份执行脚本中的后续命令。您需要执行的操作是使用sudo
或su -c
,然后使用-t
开关强制将TTY分配给SSH (如果需要输入root密码,则必须输入):
ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'
综上所述,完成您想要做的事情的一种方法是:
#!/bin/bash
ssh -t user@172.1.1.101 "
sudo some_command
sudo service server_instance stop
sudo some_other_command
"
由于sudo
通常会在再次询问root密码之前记住您的授权级别几分钟,因此,仅sudo
在需要以root身份运行的所有命令之前添加前缀,可能是在服务器上以root身份运行命令的最简单方法。NOPASSWD
为您的用户添加规则/etc/sudoers
将使过程更加流畅。
我希望这有帮助 :-)
NOPASSWD
规则的更多信息,请查看底部的示例man sudoers
。另外,请记住visudo
在编辑sudoers
文件时使用以避免损坏!
su -c
而不是sudo
,则应使用带有-t
标志的SSH运行-执行命令时,系统将提示您在服务器上输入root密码。su
不支持(据我所知)直接提供密码作为命令行参数(据我所知),也不推荐-因为简单地ps -ef | grep su
显示了传递给所有参数的参数su
,包括
su -c
通过SSH 调用:ssh -t user@host 'su -lc "
<br /> echo this is a test
<br /> echo this is another test
<br /> "
<br />'
<br />
以上内容替换为脚本中的换行符。离题:您可以在ServerFault注释中添加换行符吗?发布代码段时,这将非常有用...
不会。即使您将密码设置为su
,您仍然必须处理su
将打开一个新shell 的事实,这意味着您的其他命令将不会传递给它。您将需要为根操作编写脚本以及可以以适当特权调用它的帮助程序可执行文件。
写一个期望脚本。我知道您已经找到了答案,但是如果您必须登录到一堆需要交互式密码输入的服务器,这可能会有所帮助。
这是一种基于TCL的语言,因此与普通的旧Shell脚本相比可能有点怪异。但是它可以处理文本输入的自动化,而且您猜到了,它可以在输入任何类型的自动密码输入或特权升级之前“期望”某些输出。
这是一个很好的指南链接:http : //bash.cyberciti.biz/security/expect-ssh-login-script/
以防万一该网站出现故障:
#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
# ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
我知道这有点晚了,但是我个人将使用CPAN提供的Net :: SSH :: Expect。
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod