Paramiko SSH连接错误:socket.gaierror:[Errno 8] nodename也没提供servname,或者不知道

时间:2017-09-17 12:27:57

标签: python eclipse ssh macos-sierra paramiko

我在Python和Paramiko方面遇到了一些问题。我想连接到SSH服务器以自动从不同系统读取一些信息。

我尝试了一些我在这里找到的提示,但没有任何效果。我检查了hosts文件,使用brew重新安装Python,更新/升级Python和Paramiko,使用我的localhost上的ssh-server进行测试。还运行pip来更新paramiko和python。

我很困惑。请让我问你。

这是我的工作环境:

  • MacOS Sierra 10.12.6
  • Python 2.7
  • 的Eclipse
  • SSH库:Paramiko(paramiko-2.2.1-py2.py3-none-any.whl)

脚本:基本Paramiko SSH连接

package org.nctta.nctta_tournaments;

/**
 * Created by John on 9/15/2017.
 */

import android.app.Activity;
import android.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.content.Context;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import org.nctta.nctta_tournaments.fragments.TournamentFragment;

import java.util.ArrayList;

public class TournamentAdapter extends ArrayAdapter<Tournament> {

//create a new TournamentAdapter object.
public TournamentAdapter(Context context, ArrayList<Tournament> tournaments) {
    super(context, 0 , tournaments);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //check if an existing view is being reuse, otherwise inflate the view
    View listItemView = convertView;
    if (listItemView ==null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
            R.layout.tournament_list_item, parent, false);
    }
    //get the current tournament object at this position in the list
    Tournament currentTournament = getItem(position);

    //Find the TExtView in the tournament_list_item.xml layout with iD of name
    TextView TourName = (TextView) listItemView.findViewById(R.id.Name);
    //get/set the tournament name of the current tournament object
    TourName.setText(currentTournament.getTournamentName());
    //Find the TextView in the tournament_list_item.xml layout with ID of Location
    TextView TourLocation = (TextView) listItemView.findViewById(R.id.Location);
    //get/set the tournament location of the current tournament object;
    TourLocation.setText(currentTournament.getTournamentLocation());
    //Find the linearlayout with id of text_container
    LinearLayout textArea = (LinearLayout) listItemView.findViewById(R.id.text_container);
    textArea.setTag(currentTournament.getTournamentName());
    //Find map view button with id of imageButton
    ImageButton mapButton = (ImageButton) listItemView.findViewById(R.id.imageButton);
    mapButton.setTag(currentTournament.getTournamentName());
    final Context context = parent.getContext();
    final FragmentManager fm = ((Activity) context).getFragmentManager();
    //set onclicklisteners
    textArea.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String str = v.getTag().toString();
            Toast.makeText(getContext(),str + "TEXT", Toast.LENGTH_SHORT).show();
            //start tournament fragment

            fm.beginTransaction()
                    .replace(R.id.content_frame, new TournamentFragment())
                    .commit();
        }
    });
    mapButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String str = v.getTag().toString();
            Toast.makeText(getContext(),str + "MAP", Toast.LENGTH_SHORT).show();
        }
    });

    return listItemView;
}
}

使用此输出在Eclipse上运行脚本:

'''
Created on 16.09.2017


'''
import sys
import telnetlib
import paramiko


host = '213.000.000.123'    # 
user = "user"
password = "password"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, user, password)

好的,我发现了gai = getaddrinfo,还有getaddrbyname等等。所以我认为将主机字符串解析为IP地址存在问题。但是将IP地址解析为IP地址并没有意义。我使用了显式IP。 使用&#34; ssh 213.000.000.123&#34;命令直接在CLI上工作正常。

我也尝试连接到&#34; localhost&#34;或&#34; 127.0.0.1&#34;或&#34; google.com&#34;或其他。 hosts-file-entry未被注释,因此它处于活动状态。结果:情况相同。

NSLOOKUP工作正常,因此DNS查找工作正常,DNS服务器可用。

似乎Python可以在Eclipse中找到paramiko库,但是库中存在问题。

任何人都可以帮助我看看我的眼睛没有看到的东西。

非常感谢!

问候

1 个答案:

答案 0 :(得分:3)

错误消息非常具有误导性。它实际上与DNS错误无关。

显然,paramiko使用的默认端口是22以外的端口。一旦我指定了端口,问题就会消失。

port = 22
k = paramiko.RSAKey.from_private_key_file(key_filename)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hostname = os.environ['DOCKER_EE_MANAGER_NODE']
username = os.environ['UCP_USER']

ssh.connect(hostname, port, username, pkey = k)

作品!享受!