6
回答
求教ssh连接不能直接发送命令的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

折腾的是git和copssh,不过copssh也是用的openssh吧?而且多次测试,认为问题是在ssh连接上导致的,所以请玩ssh的大神们指点一下


具体的是使用

ssh user@domin git-receive-pack my.git

无返回指令,准确地说用ssh user@domin "echo sth"一样的没有任何输出,但是却是登陆进入了ssh的

正常情况下应该是git-receive-pack返回一个字符串,以0000结尾,这个发出来后告诉client端中断然后继续发送交互指令,但是因为git-receive-pack这个指令一直没有发出去,就导致一直无法用,

求指点一二!

举报
流海
发帖于2年前 6回/377阅
共有6个答案 最后回答: 2年前

引用来自“Oo_”的评论

接入后,使用的shell没有问题吧。

接入shell后,使用可用的任何命令都完全正常,符合预期

但是直接 ssh user@domin the_send_cmd就不行

需要看copssh的debug吗?

示例是用证书加密码登陆的修改为你自己的就行了

 
#!/usr/bin/expect 
set work "/work" 
set zdate [ exec date +%Y%m%d-%H%M%S]
#写日志的函数 
proc log {msg } { 
#写日志的同时将消息打印在屏幕上 
puts " $msg \n " 
send_log " $msg \n " 
} 
log_file " $work /log/shell/locale-server.log" 
set timeout 3600
spawn ssh -i $work/shell/id_dsa user@domin
expect {Enter passphrase for key } 
send "******** \n " 
expect "#" 
send "the_send_cmd \n " 
expect "#" 
send "exit \n " 



引用来自“逐浪人”的评论

示例是用证书加密码登陆的修改为你自己的就行了

 
#!/usr/bin/expect 
set work "/work" 
set zdate [ exec date +%Y%m%d-%H%M%S]
#写日志的函数 
proc log {msg } { 
#写日志的同时将消息打印在屏幕上 
puts " $msg \n " 
send_log " $msg \n " 
} 
log_file " $work /log/shell/locale-server.log" 
set timeout 3600
spawn ssh -i $work/shell/id_dsa user@domin
expect {Enter passphrase for key } 
send "******** \n " 
expect "#" 
send "the_send_cmd \n " 
expect "#" 
send "exit \n " 



- -

不懂,wincyg我都才装……

我找了半天,只是在bash环境的etc/profile下面找到这样一个文件(修改里面的PS1后的确显示出来的东西变化了)(每次ssh连接都会输出,包括使用ssh user@domin mycmd的时候,没有mycmd的输出,但是也有下面的输出)

# If you wish to change the path for all users, it is recommended you edit
	#  /etc/bash.bashrc
	
	syspath=`/bin/cygpath -S`
	winpath=`/bin/cygpath -W`
	export PATH="/bin:$syspath:$winpath"
	export TERM=cygwin
	umask 027
	
	# Set a default prompt of: user@host and current_directory
	PS1='\[\033]0;\w\007
	\033[32m\]\u@\h \[\033[33m\w\033[0m\]
	\u@\h
	$ '
	#up is default
在用户目录下没有其他的文件,./ssh目录(包括windows用户目录的)下除了公钥私钥和访问授权没有其他文件

网络上到处搜索,没有找到明确的结论,一些可能类似的问题,则是鸟语的,看不大明确,或许是说是bash文件里面有额外的输出导致的这种情况,但除了上面我给的profile文件和./ssh目录,我就不知道查什么地方了。


引用来自“逐浪人”的评论

示例是用证书加密码登陆的修改为你自己的就行了

 
#!/usr/bin/expect 
set work "/work" 
set zdate [ exec date +%Y%m%d-%H%M%S]
#写日志的函数 
proc log {msg } { 
#写日志的同时将消息打印在屏幕上 
puts " $msg \n " 
send_log " $msg \n " 
} 
log_file " $work /log/shell/locale-server.log" 
set timeout 3600
spawn ssh -i $work/shell/id_dsa user@domin
expect {Enter passphrase for key } 
send "******** \n " 
expect "#" 
send "the_send_cmd \n " 
expect "#" 
send "exit \n " 



引用来自“流海”的评论

- -

不懂,wincyg我都才装……

我找了半天,只是在bash环境的etc/profile下面找到这样一个文件(修改里面的PS1后的确显示出来的东西变化了)(每次ssh连接都会输出,包括使用ssh user@domin mycmd的时候,没有mycmd的输出,但是也有下面的输出)

# If you wish to change the path for all users, it is recommended you edit
	#  /etc/bash.bashrc
	
	syspath=`/bin/cygpath -S`
	winpath=`/bin/cygpath -W`
	export PATH="/bin:$syspath:$winpath"
	export TERM=cygwin
	umask 027
	
	# Set a default prompt of: user@host and current_directory
	PS1='\[\033]0;\w\007
	\033[32m\]\u@\h \[\033[33m\w\033[0m\]
	\u@\h
	$ '
	#up is default
在用户目录下没有其他的文件,./ssh目录(包括windows用户目录的)下除了公钥私钥和访问授权没有其他文件

网络上到处搜索,没有找到明确的结论,一些可能类似的问题,则是鸟语的,看不大明确,或许是说是bash文件里面有额外的输出导致的这种情况,但除了上面我给的profile文件和./ssh目录,我就不知道查什么地方了。


spawn ssh -l$sshuser -p$sshport $sshhost
expect {
     -re "yes/no" {
         send "yes\r"
     } -re "password:" {
         send "$sshpwd\r"
     } -re "Permission denied, please try again." {
        exit
     } -re "Connection refused" {
         exit
     } timeout {
        exit
     } eof {
        exit
     }
}


密码登陆ssh的写法
不知道你的cyg安装了expect没有,只能帮你到这里了

引用来自“逐浪人”的评论

示例是用证书加密码登陆的修改为你自己的就行了

 
#!/usr/bin/expect 
set work "/work" 
set zdate [ exec date +%Y%m%d-%H%M%S]
#写日志的函数 
proc log {msg } { 
#写日志的同时将消息打印在屏幕上 
puts " $msg \n " 
send_log " $msg \n " 
} 
log_file " $work /log/shell/locale-server.log" 
set timeout 3600
spawn ssh -i $work/shell/id_dsa user@domin
expect {Enter passphrase for key } 
send "******** \n " 
expect "#" 
send "the_send_cmd \n " 
expect "#" 
send "exit \n " 



引用来自“流海”的评论

- -

不懂,wincyg我都才装……

我找了半天,只是在bash环境的etc/profile下面找到这样一个文件(修改里面的PS1后的确显示出来的东西变化了)(每次ssh连接都会输出,包括使用ssh user@domin mycmd的时候,没有mycmd的输出,但是也有下面的输出)

# If you wish to change the path for all users, it is recommended you edit
	#  /etc/bash.bashrc
	
	syspath=`/bin/cygpath -S`
	winpath=`/bin/cygpath -W`
	export PATH="/bin:$syspath:$winpath"
	export TERM=cygwin
	umask 027
	
	# Set a default prompt of: user@host and current_directory
	PS1='\[\033]0;\w\007
	\033[32m\]\u@\h \[\033[33m\w\033[0m\]
	\u@\h
	$ '
	#up is default
在用户目录下没有其他的文件,./ssh目录(包括windows用户目录的)下除了公钥私钥和访问授权没有其他文件

网络上到处搜索,没有找到明确的结论,一些可能类似的问题,则是鸟语的,看不大明确,或许是说是bash文件里面有额外的输出导致的这种情况,但除了上面我给的profile文件和./ssh目录,我就不知道查什么地方了。


引用来自“逐浪人”的评论

spawn ssh -l$sshuser -p$sshport $sshhost
expect {
     -re "yes/no" {
         send "yes\r"
     } -re "password:" {
         send "$sshpwd\r"
     } -re "Permission denied, please try again." {
        exit
     } -re "Connection refused" {
         exit
     } timeout {
        exit
     } eof {
        exit
     }
}


密码登陆ssh的写法
不知道你的cyg安装了expect没有,只能帮你到这里了

厄,我密码登陆和私钥登陆都试过了的,不过这个应该和登陆方式没啥关系吧?

谢谢!

cygwin才下下来(慢得要死),所有东西都还没有配置,目前还是用的win下的自带bash的东西在测试。在安装目录下搜索到这个东西:

LocalCommand Specifies a command to execute on the local machine after successfully connecting to the server. The command string extends to the end of the line, and is executed with the user's shell. The following escape character substitutions will be performed: `%d' (local user's home directory), `%h' (remote host name), `%l' (local host name), `%n' (host name as provided on the command line), `%p' (remote port), `%r' (remote user name) or `%u' (local user name).

The command is run synchronously and does not have access to the session of the ssh(1) that spawned it. It should not be used for interactive commands.

This directive is ignored unless PermitLocalCommand has been enabled.

如果我要用上面所述的代码,那么应该写在哪个文件里面啊?(我的意思是怎么让你的代码用起来啊?)

顶部